在initState中调用SetState的重要性

Pur*_*rus 6 flutter

setState()方法应该被称为的内部initState()方法StatefullWidget吗?

我的理解是该initState()方法将自动应用状态。

下面的代码不起作用。post对象的值为空。

  @override
  void initState() {
    ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
        post = ItemService.getPostFromDocument(doc);
    });
  }
Run Code Online (Sandbox Code Playgroud)

但是下面的作品。

  @override
  void initState() {
    ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
      setState((){
        post = ItemService.getPostFromDocument(doc);
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

在其他一些情况下,即使不使用setState()同一类也可以正常工作。

因此,什么时候应该使用setState()内部initState()方法,什么时候不应该使用?

另一个相关问题:

super.initState()initState()什么时候应该打电话给我?我不打扰没关系吗?

Rém*_*let 17

您不需要setState在 initState 中使用。事实上,如果你这样做,它是行不通的。

问题是,你没有在你的例子中呼唤setState内在initState

您所做的是调用setState异步事件。但是因为是异步的,所以initState方法已经完成了

  • 谢谢。但它令人困惑.. 我应该将所有异步调用包装在 initState 内的 setState 方法中吗?还是根本不应该使用它?您的回答提供了两种不同的含义。你能解释一下或发布一个简单的例子吗.. (2认同)

Sea*_*lai 10

setState()方法通知框架有状态窗口小部件的内部状态已更改。调用此方法将触发窗口小部件以最新状态值进行重建,因此无需在initState()生命周期方法内调用它,因为仅在将窗口小部件插入窗口小部件树中时(即,在初始化窗口小部件时)才调用该方法。 )。

您可以在setState()此处阅读有关该方法的更多信息:setState方法

至于initState()生命周期方法,每当您重写此方法时,都必须super.initState();在方法的开头或结尾处调用它,否则,小部件将遇到一些问题。诸如未将小部件插入小部件树的问题。

与第二个代码段一样,您只能setState()initState()内部使用回调函数。之所以起作用,是因为在运行回调时,该窗口小部件已经被初始化并插入到窗口小部件树中,并且内部状态需要更新以触发重建。

另外,请注意,setState()只有在挂载了小部件的情况下才起作用。因此,每个窗口小部件都具有一个bool this.mounted属性,可以在不确定不确定该属性的情况下进行检查,以确保在setState()调用时该窗口小部件是否仍将挂载。未挂载窗口小部件时调用它可能会使您的应用程序崩溃。所以我建议不要setState()在小部件类外部调用。