当用户导航到特定页面时,我正在尝试使用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'));
});
});
}
答案 0 :(得分:1)
您拥有正确的context
。但是您应该使用一些Dialog
小部件来获得正确的对话框。
showDialog(context: context, builder: (context) {
return new SimpleDialog(children: <Widget>[new Center(child: new Container(child: new Text('foo')))]);
});
答案 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看起来更干净。