首页 文章

在initState中调用SetState的重要性

提问于
浏览
3

setState() 方法应该在 initState()initState() 方法中调用?

我的理解是 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() 何时不使用?

Another Relevant Questions:

我何时应该在 initState() 内拨打 super.initState() ?如果我不打电话是否重要?

2 回答

  • 3

    setState() 方法通知框架有状态窗口小部件的内部状态已更改 . 调用此方法是触发窗口小部件使用最新状态值进行重建的原因,因此不必在 initState() 生命周期方法中调用它,因为只有在窗口小部件插入窗口小部件树时(即窗口小部件是初始化) .

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

    对于 initState() 生命周期方法,无论何时覆盖此方法,都要在方法的开头或结尾调用 super.initState(); ,否则,您将遇到小部件的一些问题 . 像小部件没有插入小部件树的问题 .

    你可以在 initState() 内使用 setState() 的唯一一次是在回调函数中,就像你在第二个代码片段中所做的那样 . 它的工作原理是,在运行回调时,窗口小部件已经初始化并插入到窗口小部件树中,需要更新内部状态以触发重建 .

    另外,请注意 setState() 仅在安装小部件时才有效 . 出于这个原因,每个小部件都有一个 bool this.mounted 属性,如果您不确定在调用 setState() 时是否仍然挂载小部件,您可以检查该属性 . 未安装窗口小部件时调用它可能会导致应用程序崩溃 . 所以我建议不要在widget类之外调用 setState() .

  • 2

    您不需要在initState中使用 setState . 事实上,如果你这样做,它将无法工作 .

    问题是,在你的例子中,你没有在 initState 内调用 setState .

    你所做的是在异步事件上调用 setState . 但由于它是异步的, initState 方法已经完成了

相关问题