initState方法中的Flutter showDialog(context)

时间:2018-08-09 12:25:34

标签: flutter

当用户导航到特定页面时,我正在尝试使用showDialog(context, builder)显示问候消息。

我通过在该页面上的有状态小部件的showDialog方法中调用initState来尝试此操作。尽管它确实起作用,但看来我无权访问实际上下文。

Flutter中是否可以通过context方法访问initState()

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

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

4 个答案:

答案 0 :(得分:1)

您拥有正确的context。但是您应该使用一些Dialog小部件来获得正确的对话框。

            showDialog(context: context, builder: (context) {
               return new SimpleDialog(children: <Widget>[new Center(child: new Container(child: new Text('foo')))]);
            });

您可以找到更多对话框小部件herehere

答案 1 :(得分:1)

@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'));
          });
      );
    });
  }

答案 2 :(得分:0)

虽然这当然不是最流畅的方法,但是您可以创建一个函数,该函数可以在很短的时间内显示出对话框,前提是已经构建了所有东西。看起来像这样:

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

答案 3 :(得分:0)

对于新来者,您可以像其他人所说的那样在initState中访问上下文。 initState构建函数中的唯一问题尚未执行。因此,此上下文是空的。

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

SchedulerBinding.instance.addPostFrameCallback((_) => doSomethingNextFrame(context));
  

addPostFrameCallback:为该帧的结尾安排一个回调。

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