我不确定initState
是否是正确的函数,我试图实现的是检查页面何时呈现以执行一些检查,并根据这些检查打开一个AlertDialog
以进行一些设置(如果需要)。
我得到了一个有状态的页面,它的initState
函数看起来像这样:
@override
void initState() {
super.initState();
if (!_checkConfiguration()) {
_showConfiguration(context);
}
}
_showConfiguration
是这样的:
void _showConfiguration(BuildContext context) {
AlertDialog dialog = new AlertDialog(
content: new Column(
children: <Widget>[
new Text('@todo')
],
),
actions: <Widget>[
new FlatButton(onPressed: (){
Navigator.pop(context);
}, child: new Text('OK')),
],
);
showDialog(context: context, child: dialog);
}
如果有更好的方法来进行检查,如果需要调用模态,请给我指出正确的方向,我正在寻找一个onState
或onRender
函数,或者一个回调函数,我可以分配给build
函数在渲染时调用,但无法找到。
编辑:这里似乎也有类似的问题:Flutter Redirect to a page on initState
6条答案
按热度按时间ykejflvf1#
成员变量context可以在
initState
期间访问,但不能用于所有的操作,这来自flutter forinitState
文档:不能从此方法中使用
[BuildContext.inheritFromWidgetOfExactType]
。但是,将在此方法之后立即调用[didChangeDependencies]
,并且可以在此方法中使用[BuildContext.inheritFromWidgetOfExactType]
。您可以将初始化逻辑移到
didChangeDependencies
,但是这可能不是您想要的,因为didChangeDependencies
在小部件的生命周期中可能被多次调用。如果您改为进行异步调用,将调用委托到小部件初始化之后,那么您就可以按照自己的意愿使用上下文。
一个简单的方法就是利用未来。
另一种可能更“正确”的方法是使用flutter的调度器添加一个帧后回调:
最后,这里有一个我喜欢在initState函数中使用异步调用的小技巧:
下面是一个使用简单Future.delayed的完整示例:
通过评论中提供的OP的更多内容,我可以给予一个稍微好一点的解决方案来解决他们的具体问题。根据应用程序的不同,你实际上可能想根据应用程序是否是第一次打开来决定显示哪个页面,也就是说,将
home
设置为不同的东西。对话框不一定是移动的上最好的UI元素;最好显示一个完整的页面,上面有他们需要添加的设置和一个下一步按钮。frebpwbc2#
用
Future
Package4jb9z9bj3#
=====已更新======
正如Lucas Rueda所指出的(感谢他:),当我们需要在
initState()
中得到context
以便处理“Provider“时,我们应该将参数listen
设置为=false
,这是有意义的,因为我们不应该监听initState()
阶段。==========旧答案======
这个线程中
initState()
的大多数例子可能是“UI”的作品,比如“对话框”,这是这个线程的根本问题。但不幸的是,当我应用它来获取“Provider“的
context
时,它不起作用。因此,我选择了
didChangeDependencies()
方法,正如在公认的答案中提到的,它有一个警告,即在小部件的生命周期中可以多次调用它。它很容易处理,只需使用一个helper变量bool
来防止didChangeDependencies()
内部的多次调用。以下是_BookListState
类的示例用法,变量_isInitialized
作为“多个调用”的主要“停止器”:下面是我尝试使用
initState()
方法时的错误日志:gywdnpxw4#
使用简单
Timer.run()
zysjyyx45#
我们可以使用全局密钥作为:
polhcujo6#
这是使用方法构建小部件中的键来完成的。
首先创建密钥:
在我们绑定小工具后:
最后我们使用键调用.currentContext参数。
编程愉快。