导航后打开颤动对话框

时间:2018-06-11 21:06:47

标签: flutter

我调用Navigator pushReplacement在我的flutter应用程序中显示一个新视图,并希望立即弹出一个简单的对话框,将该页面介绍给用户。 (我希望用户能够在后台看到新视图)

如果我在窗口小部件的构建方法中调用showDialog,然后从构建方法返回一个窗口小部件(scaffold),我会收到错误,指出flutter已经在绘制窗口小部件。我希望我需要监听构建完成事件,然后调用showDialog。

如何做到这一点的指导意见。

3 个答案:

答案 0 :(得分:15)

你可以在'initState()'内部调用对话框,在绘制完第一帧后再显示它的外观。

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await showDialog<String>(
        context: context,
        builder: (BuildContext context) => new AlertDialog(
              title: new Text("title"),
              content: new Text("Message"),
              actions: <Widget>[
                new FlatButton(
                  child: new Text("OK"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            ),
      );
    });
  }

答案 1 :(得分:0)

另一种实现方法是使用Timer.run(...)

@override
void initState() {
  super.initState();

  // simply use this
  Timer.run(() {
    showDialog(
      context: context,
      builder: (_) => AlertDialog(title: Text("Dialog title")),
    );
  });
}

答案 2 :(得分:0)

解决方案后显示基于小部件值的对话框的任何人。

例如,让用户知道他们试图查看的屏幕已被删除。

if (xxx.timestamps.deleted == null) {
  return DetailView(xxx: xxx);
} else {
  return FutureBuilder(
    future: Future.delayed(
      Duration.zero,
      () => showDialog(
          context: context,
          builder: (_) => ActionDialog(
              title: Text('xxx Deleted'),
              content: Text('xxx deleted'),
              confirmActions: [DialogConfirm.Ok])).then(
        (value) => Navigator.pop(context),
      ),
    ),
    builder: (context, _) => DetailView(xxx: xxx),
  );
}

https://stackoverflow.com/a/64017240/2641128

表示敬意