如何在flutter中await完成后关闭Alert对话框

问题描述 投票:0回答:5
 updateDetails() async{  
           showDialog(   
              context: context,  
              builder: (BuildContext ctxt) {  
                return Container(  
                  child: AlertDialog(   
                    content: Row(   
                      children: [  
                        Container(  
                          child: Text("Updating profile..."),  
                        ),  
                        CircularProgressIndicator(),  
                      ],  
                    ),  
                  ),  
                );  
              });  
    await updateDetails();  
    //NOW I HAVE TO CLOSE THIS DIALOG  
    } 
flutter dart flutter-dependencies flutter-web
5个回答
1
投票

尝试下面的代码希望它对您有帮助,在下面的代码中我添加了 Future.delayed 它使用的函数是 future,在延迟后运行其计算。(您的警报在 5 秒后自动关闭)

 showAlert() {
  showDialog(
  context: context,
  builder: (context) {
    Future.delayed(
      Duration(seconds: 5),
      () {
        Navigator.of(context).pop(true);
      },
    );

    return AlertDialog(
      title: Text('Title Here'),
      content: Text('Data'),
    );
  },
 );
}

注意:根据需要更改秒数


0
投票

数据加载完成后,您必须调用以下代码:

Navigator.pop(context);

注意:您应该在 showDialog 前面添加

return
才能让 wait 工作。

编辑: 如果您在按钮按下事件中调用 showDialog,您可以尝试以下代码:

showDialog();
await updateDetails();
Navigator.pop(context);

更新完成后,将弹出对话框。


0
投票

我将 AlertDialog 的 BuildContext 传递给动态变量,然后用它在 Future 函数之后弹出 BuildContext。

使用您的代码的示例:

     updateDetails() async{

       //added this dynamic variable
       dynamic context_to_pop;

       showDialog(   
          context: context,  
          builder: (BuildContext ctxt) {

            //assigned the context to my variable
            context_to_pop = cxtx;

            return Container(  
              child: AlertDialog(   
                content: Row(   
                  children: [  
                    Container(  
                      child: Text("Updating profile..."),  
                    ),  
                    CircularProgressIndicator(),  
                  ],  
                ),  
              ),  
            );  
          });  
  await updateDetails();  

  //and used it to pop the dialog when updateDetails() is done
  Navigator.of(context_to_pop).pop();
} 

0
投票
start(BuildContext context) async {
try {
  BuildContext? dialogContext = null;

  showDialog(
    context: context,
    builder: (context) {
      dialogContext = context;
      return AlertDialog(
        content: Container(
          height: 50,
          child: Center(
            child: CircularProgressIndicator(),
          ),
        ),
      );
    },
  ).then((o) {
    dialogContext = null;
  });

  final file = File(savePath);
  final sink = file.openWrite();

  _getAudio().listen((data) {
    sink.add(data);
  }, onError: (e) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(e.toString())),
    );
  }, onDone: () {
    sink.close();
    if (dialogContext != null) {
      Navigator.of(dialogContext!).pop();
    }
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text("ok")),
    );
  });
} catch (e) {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text(e.toString())),
  );
}

0
投票

如 Android Studio 中所述,在执行所有先前答案时发出警告:

不要跨异步间隙使用 BuildContext。

如果您仍然想这样做,请确保在使用它之前检查上下文是否仍然已安装,因为用户在使用它时可能在对话框外部单击:

if(!context.mounted)

文档:https://dart.dev/tools/linter-rules/use_build_context_synchronously

© www.soinside.com 2019 - 2024. All rights reserved.