flutter - 在 initState 中调用 SetState 的重要性

标签 flutter

是否应该在 StatefullWidgetinitState() 方法中调用 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()

关于flutter - 在 initState 中调用 SetState 的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53363774/

相关文章:

Flutter web,禁用对 Tab 按下按钮的关注

sqlite - 如何使 SUM 函数在 SQLITE(Sqflite) 中返回一个整数而不是一个字符串?

Flutter:扩展与灵活

image - flutter 行 : Dynamic Height & Vertical Stretch

flutter - : Error: The getter 'ut' isn't defined for the class 'BlocBase<State>'

从 Flutter Image_Picker 插件获取的图像尺寸太大

flutter - getter 'documents' 没有为类型 'QuerySnapshot' 定义

flutter - VsCode Flutter Dart 语法颜色,无法更改

flutter - 如何从 flutter 中的 isolate 调用平台代码?

dart - Flutter:如何根据我在游戏应用程序中花费的时间来创建评分系统?