Flutter 在颤振时间之前关闭ModalBottomSeet会导致黑屏

Flutter 在颤振时间之前关闭ModalBottomSeet会导致黑屏,flutter,dart,Flutter,Dart,我正在尝试使用showModalBottomSheet创建一个模式底部工作表,它将显示一个表单来注册todo项目。这个想法是,一旦todo项目被注册,我想在几秒钟后显示一个检查图标,然后自动关闭工作表 以下是片段: FloatingActionButton _floatingActionButton(BuildContext context) { return FloatingActionButton( child: Icon(Icons.add), onPres

我正在尝试使用showModalBottomSheet创建一个模式底部工作表,它将显示一个表单来注册todo项目。这个想法是,一旦todo项目被注册,我想在几秒钟后显示一个检查图标,然后自动关闭工作表

以下是片段:

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在你这样的情况下真的很有用。