Flutter StatefulWidget 生命周期

一般提到 flutter 的生命周期,有 App 的生命周期和StatefulWidget 生命周期两个概念。本文只讨论 StatefulWidget 的生命周期。

StatefulWidget 生命周期指的是 StatefulWidget 从创建到销毁的过程,实际上体现在 State 类的的方法的调用顺序和调用时机。

1.createState

createStateStatefulWidget 创建 State 的方法。从 State 的角度来说,这个方法是个构造方法,只会调用一次。
但是从 StatefulWidget 角度来说,这个方法会在 StatefulWidget 的生命周期里调用多次,如果 StatefulWidget 在树的不同位置,framework 会调用 createState 多次来创建不同的 State。如果StatefulWidget从树中移除再插入树的话,framework 会调用 createState 来刷新 State。

调用时机:当 StatefulWidget 插入树中调用。

  /// The framework can call this method multiple times over the lifetime of
  /// a [StatefulWidget]. For example, if the widget is inserted into the tree
  /// in multiple locations, the framework will create a separate [State] object
  /// for each location. Similarly, if the widget is removed from the tree and
  /// later inserted into the tree again, the framework will call [createState]
  /// again to create a fresh [State] object, simplifying the lifecycle of
  /// [State] objects.

2.initState

initState 是在 createState 之后调用,只会调用一次,一般只在这里执行只需要调用一次的初始化方法,例如订阅者。

///  * In [initState], subscribe to the object.
  ///  * In [didUpdateWidget] unsubscribe from the old object and subscribe
  ///    to the new one if the updated widget configuration requires
  ///    replacing the object.
  ///  * In [dispose], unsubscribe from the object.

3. didChangeDependencies

didChangeDependencies 在 initState 之后调用,如果调用了 [BuildContext.dependOnInheritedWidgetOfExactType]方法,InheritedWidget 在数据改变时也会调用 didChangeDependencies 方法。

4.build

build() 主要是用于构建 widget 子树的,会在如下场景被调用:

在调用initState()之后。
在调用didUpdateWidget()之后。
在调用setState()之后。
在调用didChangeDependencies()之后。
在State对象从树中一个位置移除后,又重新插入到树的其他位置之后。

  /// The framework calls this method in a number of different situations. For
  /// example:
  ///
  ///  * After calling [initState].
  ///  * After calling [didUpdateWidget].
  ///  * After receiving a call to [setState].
  ///  * After a dependency of this [State] object changes (e.g., an
  ///    [InheritedWidget] referenced by the previous [build] changes).
  ///  * After calling [deactivate] and then reinserting the [State] object into
  ///    the tree at another location.

5.didUpdateWidget

当 widget 需要更新的时候会调用次方法,将 widget 属性和新的 widget 绑定,在这里对 widget 属性的更新做处理,此方法执行后会调用build方法,所以无需调用 setState。

6.reassemble

reassemble 只在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。可以调试的时候对数据进行重新初始化的操作。

7.deactivate

当 State 从树中移除的时候调用。

8.activate

activate 是在 deactivate 之后重新插入树时调用。一般发生在使用 GlobalKey 从树的某一个位置移动到另一个位置。在调用完activate后会自动调 build 方法重建。

9.dispose

dispose当 State 永久的从树中移除的时候会调用。mounted 会变为false,无法调用setState,在此方法需要释放掉持有的资源。

StatefulWidget 生命周期.png
参考资料

《Flutter实战·第二版》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容