在initState中调用SetState的重要性
问题内容:
如果setState()
方法中调用initState()
的方法StatefullWidget
?
我的理解是该initState()
方法将自动应用状态。
下面的代码不起作用。post对象的值为空。
@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()
同一类,也都可以正常工作。
因此,什么时候应该使用setState()
内部initState()
方法,什么时候不应该使用?
另一个相关问题:
super.initState()
我initState()
什么时候应该打电话给我?我不打扰没关系吗?
问题答案:
该setState()
方法通知框架有状态窗口小部件的内部状态已更改。调用此方法是触发窗口小部件以最新状态值重建的原因,因此不必在initState()
生命周期方法内调用它,因为仅在将窗口小部件插入窗口小部件树时(即,在初始化窗口小部件时)才调用一次)。
您可以在setState()
此处阅读有关该方法的更多信息:setState方法
至于initState()
生命周期方法,每当您重写此方法时,都
必须super.initState();
在方法的开头或结尾处调用它,否则,小部件将遇到一些问题。诸如小部件未插入小部件树的问题。
像在第二个代码片段中一样,您只能setState()
在initState()
内部使用回调函数。之所以起作用,是因为在运行回调时,该窗口小部件已经被初始化并插入到窗口小部件树中,并且内部状态需要更新以触发重建。
另外,请注意,setState()
只有在安装了小部件时,它才起作用。因此,每个窗口小部件都有一个bool this.mounted
属性,可以在不确定不确定该属性的情况下进行检查,以确保在setState()
调用时该窗口小部件是否仍将挂载。未挂载窗口小部件时调用它可能会使您的应用程序崩溃。所以我建议不要setState()
在小部件类外部调用。