Flutter 在颤振时间之前关闭ModalBottomSeet会导致黑屏
我正在尝试使用showModalBottomSheet创建一个模式底部工作表,它将显示一个表单来注册todo项目。这个想法是,一旦todo项目被注册,我想在几秒钟后显示一个检查图标,然后自动关闭工作表 以下是片段:Flutter 在颤振时间之前关闭ModalBottomSeet会导致黑屏,flutter,dart,Flutter,Dart,我正在尝试使用showModalBottomSheet创建一个模式底部工作表,它将显示一个表单来注册todo项目。这个想法是,一旦todo项目被注册,我想在几秒钟后显示一个检查图标,然后自动关闭工作表 以下是片段: FloatingActionButton _floatingActionButton(BuildContext context) { return FloatingActionButton( child: Icon(Icons.add), onPres
FloatingActionButton _floatingActionButton(BuildContext context) {
return FloatingActionButton(
child: Icon(Icons.add),
onPressed: () async {
await _showBottomSheet(
context: context,
content: CreateTodoForm(
onClose: () {
...
Navigator.pop(context);
},
),
);
},
);
}
在CreateToForm小部件中:
class _CreateTodoFormState extends State<CreateTodoForm> {
TextEditingController titleController = TextEditingController();
bool completed = false;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => getIt<TodoFormBloc>(),
child: BlocBuilder<TodoFormBloc, ITodoFormState>(
builder: (context, state) {
...
if (state is SubmittedTodo) {
Future.delayed(Duration(seconds: 2), widget.onClose);
return Container(
height: 127,
child: Icon(Icons.check, size: 50, color: Colors.white),
);
}
...
},
),
);
}
class\u CreateTodoFormState扩展状态{
TextEditingController标题控制器=TextEditingController();
bool completed=false;
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:()=>getIt(),
孩子:BlocBuilder(
生成器:(上下文、状态){
...
如果(状态为SubmittedTodo){
Future.delayed(持续时间(秒:2),widget.onClose);
返回容器(
身高:127,
子项:图标(图标。检查,大小:50,颜色:颜色。白色),
);
}
...
},
),
);
}
您可以看到,当状态为SubmittedTodo(todo已成功提交)时,我返回一个带有复选图标的容器,2秒钟后我调用onClose函数,该函数调用Navigator.pop(上下文)以关闭工作表
这很好,但有一个问题……如果用户在2秒钟完成之前点击设备上的<按钮,或向下滑动工作表将其关闭,则工作表会因用户操作而关闭,然后未来会完成,它基本上会关闭应用程序(应用程序会完全黑屏)
因此,我的问题是如何在一段时间后安全地自动关闭工作表,而不必担心用户会做什么
发生这种情况可能是因为
Navigator.pop(上下文);
在单击“上一步”按钮后被调用,导致两次弹出。显示黑屏是因为没有其他屏幕可导航回。
作为一个解决方案,我建议通过
WillPopScope
包装您的表单小部件,然后您会收到通知,用户单击了后退按钮。在这里,您可以通过调用onClose
关闭表单。您好,是的,这正是发生的情况,但我想知道如何修复它。您的解决方案起作用了,但我稍微做了一些更改,将WillPopScope小部件。由于我希望用户能够在未提交的情况下关闭底部的工作表,因此我包装了检查图标容器,以便只有当该图标出现时,返回按钮才被禁用,用户必须等待2秒钟,直到工作表自行关闭。谢谢!我不知道WillPopScope小部件。听到这个消息很高兴是的Willposcope在你这样的情况下真的很有用。