是否应该在 StatefullWidget
的 initState()
方法中调用 setState()
方法?
我的理解是 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()
而什么时候不应该呢?
其他相关问题:
我应该什么时候在我的 initState()
中调用 super.initState()
?我不打电话有关系吗?
最佳答案
setState()
方法通知框架 Stateful 小部件的内部状态已更改。调用此方法会触发小部件以最新状态值重建,因此无需在 initState()
生命周期方法中调用它,因为它仅在小部件插入时调用一次小部件树(即小部件初始化时)。
您可以在此处阅读有关 setState()
方法的更多信息:setState method
对于 initState()
生命周期方法,无论何时重写此方法,您必须在开始时调用 super.initState();
或方法结束,否则,您的小部件会遇到一些问题。小部件未插入小部件树等问题。
您可以在 initState()
内使用 setState()
的唯一时间是在回调函数中,就像在第二个代码片段中所做的那样。它之所以有效,是因为在运行回调时,小部件已经初始化并插入到小部件树中,并且需要更新内部状态以触发重建。
另外,请注意 setState()
仅在挂载小部件时才起作用。出于这个原因,每个小部件都有一个 bool this.mounted
属性,如果您不确定在 setState()
为叫。在未安装小部件时调用它可能会使您的应用程序崩溃。所以我建议不要在小部件类之外调用 setState()
。
https://stackoverflow.com/questions/53363774/