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
}
尝试下面的代码希望它对您有帮助,在下面的代码中我添加了 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'),
);
},
);
}
注意:根据需要更改秒数
数据加载完成后,您必须调用以下代码:
Navigator.pop(context);
注意:您应该在 showDialog 前面添加
return
才能让 wait 工作。
编辑: 如果您在按钮按下事件中调用 showDialog,您可以尝试以下代码:
showDialog();
await updateDetails();
Navigator.pop(context);
更新完成后,将弹出对话框。
我将 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();
}
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())),
);
}
如 Android Studio 中所述,在执行所有先前答案时发出警告:
不要跨异步间隙使用 BuildContext。
如果您仍然想这样做,请确保在使用它之前检查上下文是否仍然已安装,因为用户在使用它时可能在对话框外部单击:
if(!context.mounted)
文档:https://dart.dev/tools/linter-rules/use_build_context_synchronously