flutter - 从 AlertDialog 中调用 SnackBar
问题描述
当用户单击删除员工时,将弹出一个 AlertDialog 以警告用户。
如果用户确认删除,则 AlertDialog 消失,并且在 Scaffold 的底部应该出现一个带有 Undo 功能的 SnackBar。
问题:
当我在 AlertDialog 类中实现 SnackBar 方法showSnackBar(context, index, employee)时,出现以下错误:
在处理手势时抛出了以下断言:
使用不包含 Scaffold 的上下文调用 Scaffold.of()。
showDeleteDialog(BuildContext context, Employee employee, int index) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title:
Text('Are you sure you want to delete: ${employee.name} ?'),
actions: <Widget>[
Row(
children: <Widget>[
FlatButton(
child: Text('Yes'),
onPressed: () {
DatabaseProvider.db.deleteEmployee(employee.id).then(
(_) => BlocProvider.of<EmployeeBloc>(context)
.add(DeleteEmployee(index)));
Navigator.pop(context,employee);
showSnackBar(context, index, employee);
}),
FlatButton(
child: Text('No!'),
onPressed: () => Navigator.pop(context)),
],
)
],
));
}
相反,当我确认删除时,我认为我可以从 showDeleteDialog 返回一个员工。当结果不为空时,我应该显示 SnackBar。我试图用 Future/Async 来实现它,但没有成功。
onPressed: () async {
Employee deletedEmployee = await showDeleteDialog(context, employee, index);
await showSnackBar(context, index, deletedEmployee);
},
编辑:如果可能,我想避免使用GlobalKey,因为我读到它对应用程序的性能不利。
解决方案
正如错误所说Scaffold.of() called with a context that does not contain a Scaffold.
,这意味着context
您传递给showSnackBar()
方法的电流在直接父级中不包含 a Scaffold
。
我们可以通过使用来解决这个问题GlobalKey
并将其分配给Scaffold
. 在您的有状态小部件中声明 aglobal key
并将其作为您的键传递Scaffold
,如下所示:
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
....
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text(widget.title),
),
我在单击按钮_showSnackBar()
后调用一个方法,如下所示:navigator.pop()
OK
alertDialog
return AlertDialog(
title: Text('Not in stock'),
content: const Text('This item is no longer available'),
actions: <Widget>[
FlatButton(
child: Text('Ok'),
onPressed: () {
Navigator.of(context).pop();
_showSnackBar();
},
),
],
);
然后在_showSnackBar()
方法中,使用 键显示snackbar,如下:
void _showSnackBar() {
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text('Snackbar is displayed'),
));
}
使用这种方法,一旦您点击OK
按钮alertDialog
,对话框将关闭,您将看到小吃栏。您可能需要按照上面共享的代码自定义此设置。
希望这能回答您的问题并解决您的问题。
推荐阅读
- laravel - Laravel Echo 不监听推送事件
- javascript - 有没有办法将多个搜索功能组合成一个下拉选择?
- node.js - 如何更新 nodemailer 以使用 https (SSL)
- javascript - 单击时如何更改按钮文本?
- architecture - 在从单一遗留应用程序增量迁移中处理状态数据
- pandas - 有没有办法对 2 个数据帧进行真正的 sql 类型合并
- c# - 为什么我的简单 ajax 帖子没有调用 c# web 方法?
- .net - 是否所有 C++/CLI 对象都需要处理?
- python - 如何根据条件将元素连接到同一列表中的其他元素
- wpf - 如何设置将文本框绑定到不在数据上下文类中的类