showDialog(context, builder)当用户导航到某个页面时,我试图使用来显示问候消息。
我通过调用该页面上有状态小部件showDialog的initState方法来尝试此操作。虽然它确实有效,但我似乎无权访问实际上下文。
是否有扑了的方式来访问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'));
});
});
}
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 看起来更干净。
虽然这肯定不是最流畅的方式,但您可以制作一个功能,在短时间后显示对话框,此时一切都已经构建完毕。它看起来像这样:
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)
@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)
| 归档时间: |
|
| 查看次数: |
17049 次 |
| 最近记录: |