如何在Flutter中使AlertDialog在几秒后自动消失?

27

当用户点击按钮后,需要显示一个 alertDialog,并在几秒钟后自动消失。在 Flutter 中,我该如何实现这个功能?


1
请查看 Future<T>.delayed 构造函数。 - pskink
4个回答

60

一个最小的示例:

它会在5秒后关闭alertDialog对话框。

           showDialog(
                      context: context,
                      builder: (context) {
                        Future.delayed(Duration(seconds: 5), () {
                          Navigator.of(context).pop(true);
                        });
                        return AlertDialog(
                          title: Text('Title'),
                        );
                      });

2
如果对话框的 barrierDismissible 属性为 true,那么延迟弹出会有问题吗? - Luiey
12
这不是一个好的解决方案,因为在与用户请求结束对话后,Future.delayed开始工作并关闭另一页。 - Kiax
被踩了,这会导致用户关闭意外页面。 - Nicholas Jela
正如上面多位人士所指出的,如果你想使用这个片段,请记得将barrierDismissible设置为false,否则在时间未到之前取消窗口会出现问题。 - ulyssis2

21
Future.delayed 方法可能会导致问题,如果在 Future 触发之前关闭了对话框。所以,如果要使用它,请确保 showDialog 不可取消 barrierDismissible: false,并且 AlertDialog 没有按钮可以关闭它。
否则,您可以使用计时器:



Timer timer = Timer(Duration(milliseconds: 3000), (){
  Navigator.of(context, rootNavigator: true).pop();
});
showDialog(
  ... Dialog Code ...
).then((value){
  // dispose the timer in case something else has triggered the dismiss.
  timer?.cancel();
  timer = null;
});

3
您可能希望使用“SnackBar”来显示自动消失的通知。
final snackBar = SnackBar(
  content: Text('This is where you put the notice.'),
  duration: Duration(seconds: 2),
);
Scaffold.of(context).showSnackBar(snackBar);

嗨,我在 Channel Master 中尝试了这个,但 showSnackBar 已经被弃用了。 - Márcio Rossato

2
我建议使用FutureBuilder,这样在用户在超时之前关闭对话框时,它会自动被取消。
showDialog(
      context: context,
      builder: (context) {
        return FutureBuilder(
          future: Future.delayed(dismissDuration).then((value) => true),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              Navigator.of(context).pop();
            }

            return AlertDialog(
              content: Text(text),
            );
          },
        );
      },
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接