我想在打开应用程序之前显示一个确认警报对话框,有人能告诉我如何在Flutter中实现这一点吗?showDialog()方法需要一个上下文,因此我应该把它放在buildContext的某个地方,我假设在app的build方法中,但是我如何在屏幕上构建实际布局之前触发对话框?
3z6pesqy1#
在你的initState中,你可以添加你的回调函数,它将显示你与WidgetsBinding.instance.addPostFrameCallback的对话框,对话框将在布局后立即显示。你可以根据对话框的结果更新布局状态。
initState
WidgetsBinding.instance.addPostFrameCallback
class HomePageState extends State<HomePage> { @override void initState() { super.initState(); WidgetsBinding.instance .addPostFrameCallback((_) => showDialog(...)); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('HomePage'), ), body: Container(), ); }
u0njafvf2#
下面的代码工作,我猜这是答案
@override Widget build(BuildContext context) { Future.delayed(Duration.zero, () => showAlert(context)); return new WhateverLayoutYouWantToBeDisplayed(); } void showAlert(BuildContext context) { showDialog( child: new WhateverCustomDialogYouHave(), context: context); }
eyh26e7m3#
最好的方法是
1. WidgetsBinding
WidgetsBinding.instance.addPostFrameCallback((_) { showDialog(); });
2. SchedulerBinding
SchedulerBinding.instance.addPostFrameCallback((_) { showDialog(); });
WidgetsBinding & SchedulerBinding只会被调用一次,就像我们在initState(),中调用它一样,但是记住,它会在构建方法完成渲染时被调用。
WidgetsBinding
SchedulerBinding
initState(),
void initState() { // TODO: implement initState super.initState(); print("initState"); WidgetsBinding.instance.addPostFrameCallback((_) { print("WidgetsBinding"); }); SchedulerBinding.instance.addPostFrameCallback((_) { print("SchedulerBinding"); }); }
3条答案
按热度按时间3z6pesqy1#
在你的
initState
中,你可以添加你的回调函数,它将显示你与WidgetsBinding.instance.addPostFrameCallback
的对话框,对话框将在布局后立即显示。你可以根据对话框的结果更新布局状态。u0njafvf2#
下面的代码工作,我猜这是答案
eyh26e7m3#
最好的方法是
1. WidgetsBinding
2. SchedulerBinding
WidgetsBinding
&SchedulerBinding
只会被调用一次,就像我们在initState(),
中调用它一样,但是记住,它会在构建方法完成渲染时被调用。