Flutter 在initState中调用SetState的重要性
是否应该在Flutter 在initState中调用SetState的重要性,flutter,Flutter,是否应该在StatefullWidget的initState()方法中调用setState()方法 我的理解是initState()方法将自动应用状态 下面的代码不起作用。post对象的计算结果为null @override void initState() { ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){ post = ItemService.getPostFromDocu
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()
?我不打电话有关系吗?您不需要在initState中使用setState
。事实上,如果你这样做,它将不起作用
问题是,在您的示例中,您没有在initState
内调用setState
您要做的是对异步事件调用setState
。但是由于它是异步的,initState
方法已经完成了方法通知框架有状态小部件的内部状态已经改变。调用此方法会触发小部件使用最新状态值进行重建,因此无需在initState()
生命周期方法中调用它,因为当小部件插入到小部件树中时(即小部件初始化时),它只被调用一次
您可以在此处阅读有关setState()
方法的更多信息:
至于initState()
lifecycle方法,无论何时重写此方法,都必须调用super.initState()
在方法的开始或结束处,否则,您的小部件将遇到一些问题。小部件未插入小部件树等问题
唯一可以在initState()
内部使用setState()
的时间是在回调函数中,就像您在第二个代码段中所做的那样。这是因为,在运行回调时,小部件已经初始化并插入到小部件树中,需要更新内部状态以触发重建
另外,只需注意setState()
仅在挂载小部件时才起作用。因此,每个小部件都有一个bool this.mounted
属性,如果您不确定在调用setState()
时小部件是否仍将被装载,可以检查该属性。当小部件未装入时调用它可能会使应用程序崩溃。因此,我建议不要在widget类之外调用setState()
。我不确定,但您的第一个示例可能不起作用,因为您没有调用super.initState()
。你试过了吗?没试过。。但是super.initState()有什么影响呢?我正在努力理解它是如何工作的。我对此表示怀疑,因为在同一个类中,即使不调用supersinitstate,其他状态也可以正常工作。它解释了什么是initState,但没有解释我的问题。谢谢。但它令人困惑。。我应该将所有异步调用包装在initState中的setState方法中吗?或者根本不应该使用它?你的回答提供了两种不同的含义。你能解释一下或贴一个简单的例子吗。。