Flutter 导航后打开颤振对话框

Flutter 导航后打开颤振对话框,flutter,Flutter,我打电话给Navigator pushReplacement,在我的Flatter应用程序中显示一个新视图,并希望立即弹出一个简单的对话框,向用户介绍页面。(我希望用户能够在后台看到新视图) 如果我在小部件的构建方法中调用showDialog,然后从构建方法返回小部件(scaffold),我会收到错误,指出Flatter已经在绘制小部件。我希望我需要监听构建完成事件,然后调用showDialog 非常感谢您的指导。您可以从“initState()”内部调用对话框,在绘制第一帧后延迟其外观 @

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

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


非常感谢您的指导。

您可以从“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();
                  },
                ),
              ],
            ),
      );
    });
  }
@覆盖
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback(())异步{
等待显示对话框(
上下文:上下文,
生成器:(BuildContext上下文)=>新建AlertDialog(
标题:新文本(“标题”),
内容:新文本(“消息”),
行动:[
新扁平按钮(
子项:新文本(“确定”),
已按下:(){
Navigator.of(context.pop();
},
),
],
),
);
});
}

另一种方法是使用
定时器。运行(…)


如果有人在解决方案后显示基于窗口小部件值更新的对话框

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

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),
  );
}

很荣幸

您是如何在initState()中获得上下文的?在State类中,上下文变量始终可用。它指向这个小部件的RenderObject。问题在于,在initState()中,上下文尚未创建,因此您必须在第一帧布局完成后推迟其使用。那么它是可用的。有没有可能用一个无状态的小部件实现同样的功能?
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),
  );
}