initState 方法中的 Flutter showDialog(context)

Tom*_*myF 13 flutter

showDialog(context, builder)当用户导航到某个页面时,我试图使用来显示问候消息。

我通过调用该页面上有状态小部件showDialoginitState方法来尝试此操作。虽然它确实有效,但我似乎无权访问实际上下文。

是否有扑了的方式来访问contextinitState()方法是什么?

如果没有,是否有另一种方法可以更好地实现这种行为?

@override
void initState() {
  super.initState();
  new Future.delayed(Duration.zero, () {
    showDialog(context: context, 
    builder: (BuildContext context) {
      return new Container(child: new Text('foo'));
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

Sai*_*ili 23

对于新手,正如其他人所说,您可以访问 initState 中的上下文。initState 构建函数中唯一的问题尚未执行。所以这个上下文有点空。

要解决此问题,您可以使用SchedulerBinding

SchedulerBinding.instance.addPostFrameCallback((_) => doSomethingNextFrame(context));
Run Code Online (Sandbox Code Playgroud)

addPostFrameCallback:在此帧结束时安排回调。

Future.delayed(Duration.zero)也会起作用。但我认为 SchedulerBinding 看起来更干净。


Leo*_* Nx 6

虽然这肯定不是最流畅的方式,但您可以制作一个功能,在短时间后显示对话框,此时一切都已经构建完毕。它看起来像这样:

void initState() {
    super.initState();
    _showDialog();
  }

_showDialog() async {
    await Future.delayed(Duration(milliseconds: 50));
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return new Container(child: new Text('foo'));
        });
  }
Run Code Online (Sandbox Code Playgroud)


Cod*_*man 5

@override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await showDialog<String>(
        context: context,
        builder: (BuildContext context) => new showDialog(
           context: context, 
           builder: (BuildContext context) {
              return new Container(child: new Text('foo'));
          });
      );
    });
  }
Run Code Online (Sandbox Code Playgroud)