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方法中吗?或者根本不应该使用它?你的回答提供了两种不同的含义。你能解释一下或贴一个简单的例子吗。。