在原生 Android 、原生 iOS 、前端 React 或者 Vue 都存在生命周期的概念,在 Flutter 中一样存在生命周期的概念,其基本概念和作用相似。
StatelessWidget 用于不需要维护状态的场景,只会渲染一次,没有其他生命周期函数,因此在执行速度和效率方面比 StatefulWidget 更好。
重点看下 StatefulWidget 中的生命周期。
createState:该函数为 StatefulWidget 中创建 State 的方法,当 StatefulWidget 被调用时会立即执行 createState 。
initState:该函数为 State 初始化调用,对于每一个 State 对象,只会调用一次该回调。因此通常在该回调中做一些一次性的操作,如在此期间执行 State 各变量的初始赋值,同时也可以在此期间与服务端交互,获取服务端数据后调用 setState 来设置 State。
didChangeDependencies:该函数在 State 对象的依赖发生变化时会被调用。(这个“依赖”指的就是子 widget 是否使用了父 widget 中 InheritedWidget 的数据,典型的场景是,例如系统语言或者应用主题的改变)
build:主要是返回需要渲染的 Widget ,由于 build 会被调用多次,因此在该函数中只能做返回 Widget 相关逻辑,避免因为执行多次导致状态异常。
reassemble:该函数主要是提供开发阶段使用,在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。(正式环境下永远不会被调用)
didUpdateWidget :该函数主要是在 widget 重新构建,比如说热重载,父组件发生 build 的情况下。
Flutter framework 会调用 Widget.canUpdate 来检测 Widget 树中同一位置的新旧节点,然后决定是否需要更新。(当新旧 widget 的 key 和 runtimeType 同时相等时会返回 true,则会调用 didUpdateWidget() 该函数)deactivate:当 State 对象从树中被移除后会被调用,如果该 widget 被移除节点,然后未被插入到其他节点时,则会继续调用 dispose 永久移除。
dispose:当 State 对象从树中被永久移除时调用,并释放资源。