我打电话给Navigator pushReplacement,在我的Flatter应用程序中显示一个新视图,并想立即弹出一个简单的对话框,向用户介绍页面.(我希望用户能够在后台看到新视图)
如果我在小部件的build方法中调用showDialog,然后从build方法返回一个小部件(Scaffold),我会收到错误,指出fltter已经在绘制一个小部件.我希望我需要侦听构建完成事件,然后调用showDialog.
如何做到这一点的指导非常感谢.
我打电话给Navigator pushReplacement,在我的Flatter应用程序中显示一个新视图,并想立即弹出一个简单的对话框,向用户介绍页面.(我希望用户能够在后台看到新视图)
如果我在小部件的build方法中调用showDialog,然后从build方法返回一个小部件(Scaffold),我会收到错误,指出fltter已经在绘制一个小部件.我希望我需要侦听构建完成事件,然后调用showDialog.
如何做到这一点的指导非常感谢.
您可以从‘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();
},
),
],
),
);
});
}
在State
类中,context
变量始终可用.它指向此小部件的RenderObject
.问题是在initState()
中还没有创建上下文,所以您必须在布局第一帧之后推迟使用它.那么它就可以使用了.