导航后打开颤动对话框

Tom*_*Tom 17 flutter

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

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

关于如何做到这一点的指导意见.

che*_*ins 27

你可以在'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();
                  },
                ),
              ],
            ),
      );
    });
  }
Run Code Online (Sandbox Code Playgroud)

  • 上下文变量始终在State类中可用。它指向此小部件的RenderObject。问题在于尚未在initState()中创建上下文,因此您必须在布局第一帧后推迟其使用。然后可用。 (2认同)
  • 是否可以使用无状态小部件实现相同的目的? (2认同)

Cop*_*oad 6

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

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

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