【发布时间】:2020-07-20 22:28:28
【问题描述】:
当用户点击删除员工时,会弹出一个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,因为我读到它不利于应用程序的性能。
【问题讨论】:
-
当您调用小吃店时,您似乎没有从脚手架传递 BuiltContext
-
@LonelyWolf 完全正确。我不知道该怎么做。
-
尝试使用
Builder()Widget 包装您调用Snackbar 的小部件