无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店
Posted
技术标签:
【中文标题】无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店【英文标题】:Cannot remove the current snackbar by calling ScaffoldState().removeCurrentSnackBar() 【发布时间】:2020-06-20 20:24:08 【问题描述】:由于某种原因,即使我正在调用 ScaffoldState().removeCurrentSnackBar(),我也无法删除当前的小吃店
我没有收到任何错误消息,但由于某种原因,快餐栏不会消失。当用户从 DropdownButton 中选择一个项目时,还有其他方法可以删除小吃吧吗?
我已经尝试过 ScaffoldState().hideCurrentSnackBar() 和所有其他应该删除 SnackBar 的功能。
感谢您的回答。
class MainRoute extends StatefulWidget
@override
_MainRouteState createState() => _MainRouteState();
class _MainRouteState extends State<MainRoute>
List<Currency> dropdownItems = [
Currency(currencyName: "FOO", currencyInUSD: 22.0),
Currency(currencyName: "BOO", currencyInUSD: 22.0),
Currency(currencyName: "SOO", currencyInUSD: 22.0),
];
Currency dropdownValue;
Color color = Colors.green;
MainModel model = MainModel();
@override
void initState()
super.initState();
dropdownValue = dropdownItems[0];
@override
Widget build(BuildContext context)
return Scaffold(
///A Builder has been added so the context contains the Scaffold which
///is required to create a SnackBar
floatingActionButton: Builder(
builder: (context)
return FloatingActionButton(
child: Icon(
Icons.add,
color: kIconColor,
),
onPressed: ()
print(dropdownItems.map((item)
return DropdownMenuItem(
value: item,
child: Text(item.currencyName),
);
).toList());
setState(()
Scaffold.of(context).showSnackBar(
SnackBar(
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text('Which currency do you want to add to your list?'),
SizedBox(
height: 25.0,
),
DropdownButton<Currency>(
items: dropdownItems
.map<DropdownMenuItem<Currency>>((item)
return DropdownMenuItem(
value: item,
child: Text(item.currencyName),
);
).toList(),
value: dropdownValue,
onChanged: (value)
setState(()
dropdownValue = value;
ScaffoldState().removeCurrentSnackBar(
reason: SnackBarClosedReason.remove);
print("SnackBar removed");
);
,
)
],
),
action: SnackBarAction(
label: 'Cancel',
onPressed: ()
print('Cancel');
,
),
),
);
);
,
);
,
),
);
【问题讨论】:
试试 ScaffoldState().hideCurrentSnackBar(); 我已经试过了,还是不行 我的下一个猜测是,您应该为这两个操作使用相同的 Scaffold。您正在使用 Scaffold.of(context) 显示它,但将其隐藏在静态 Scaffold (ScaffoldState()) 中。 【参考方案1】:至于2021,你应该使用
ScaffoldMessenger.of(context).removeCurrentSnackBar()
而不是
Scaffold.of(context).removeCurrentSnackBar();
此功能在 Flutter v1.23.0-14.0.pre 之后被弃用。
【讨论】:
【参考方案2】:当用户从 DropdownButton 中选择一个项目时,而不是使用以下 onChanged 方法:
onChanged: (value)
setState(()
dropdownValue = value;
ScaffoldState().removeCurrentSnackBar(
reason: SnackBarClosedReason.remove);
print("SnackBar removed");
);
),
改用这个方法调用来移除snackbar:
onChanged: (value)
setState(()
dropdownValue = value;
Scaffold.of(context).removeCurrentSnackBar(
reason: SnackBarClosedReason.remove,
);
print("SnackBar removed");
);
),
【讨论】:
以上是关于无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店的主要内容,如果未能解决你的问题,请参考以下文章
通过(ajax/javascript)发布到 django 视图打印空查询集