应该在setState()
的{{1}}方法内部调用initState()
方法吗?
我的理解是StatefullWidget
方法将自动应用状态。
下面的代码不起作用。 post对象的值为空。
initState()
但是以下方法可行。
@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()
?我不打扰有关系吗?
答案 0 :(得分:3)
您不需要在initState中使用setState
。实际上,如果您这样做,将无法正常工作。
问题是,在示例中,您不是在setState
中调用initState
。
您要做的是在异步事件上调用setState
。但是由于它是异步的,所以initState
方法已经完成
答案 1 :(得分:3)
setState()
方法通知框架有状态窗口小部件的内部状态已更改。调用此方法将触发窗口小部件以最新状态值进行重建,因此无需在initState()
生命周期方法内调用它,因为仅当窗口小部件插入窗口小部件树中时才被调用一次(即小部件初始化时)。
您可以在此处详细了解setState()
方法:setState method
对于initState()
生命周期方法,每当您覆盖此方法时,您必须在方法的开始或结束处调用super.initState();
,否则,您会遇到一些问题。小部件出现问题。诸如未将小部件插入小部件树的问题。
您只能在setState()
中使用initState()
,就像在第二个代码片段中那样,它是在回调函数中。之所以起作用,是因为在运行回调时,该窗口小部件已经被初始化并插入到窗口小部件树中,并且内部状态需要更新以触发重建。
此外,请注意,setState()
仅在安装了小部件时才起作用。因此,每个窗口小部件都有一个bool this.mounted
属性,如果不确定在调用setState()
时是否仍会挂载该窗口小部件,可以检查该属性。未挂载窗口小部件时调用它可能会使您的应用程序崩溃。因此,建议不要在小部件类外部调用setState()
。