setState()
方法应该在 initState()
的 initState()
方法中调用?
我的理解是 initState()
方法会自动应用状态 .
下面的代码不起作用 . post对象被评估为null .
@override
void initState() {
ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
post = ItemService.getPostFromDocument(doc);
});
}
但下面的工作 .
@override
void initState() {
ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
setState((){
post = ItemService.getPostFromDocument(doc);
});
});
}
其他一些情况,即使不在同一个类中使用 setState()
,一切正常 .
那么我何时应该在 initState()
方法内使用 setState()
何时不使用?
Another Relevant Questions:
我何时应该在 initState()
内拨打 super.initState()
?如果我不打电话是否重要?
2 回答
setState()
方法通知框架有状态窗口小部件的内部状态已更改 . 调用此方法是触发窗口小部件使用最新状态值进行重建的原因,因此不必在initState()
生命周期方法中调用它,因为只有在窗口小部件插入窗口小部件树时(即窗口小部件是初始化) .您可以在此处阅读有关
setState()
方法的更多信息:setState method对于
initState()
生命周期方法,无论何时覆盖此方法,都要在方法的开头或结尾调用super.initState();
,否则,您将遇到小部件的一些问题 . 像小部件没有插入小部件树的问题 .你可以在
initState()
内使用setState()
的唯一一次是在回调函数中,就像你在第二个代码片段中所做的那样 . 它的工作原理是,在运行回调时,窗口小部件已经初始化并插入到窗口小部件树中,需要更新内部状态以触发重建 .另外,请注意
setState()
仅在安装小部件时才有效 . 出于这个原因,每个小部件都有一个bool this.mounted
属性,如果您不确定在调用setState()
时是否仍然挂载小部件,您可以检查该属性 . 未安装窗口小部件时调用它可能会导致应用程序崩溃 . 所以我建议不要在widget类之外调用setState()
.您不需要在initState中使用
setState
. 事实上,如果你这样做,它将无法工作 .问题是,在你的例子中,你没有在
initState
内调用setState
.你所做的是在异步事件上调用
setState
. 但由于它是异步的,initState
方法已经完成了