Flutter 中的生命周期,包含以下几个阶段:
-
createState ,该函数为 StatefulWidget 中创建 State 的方法,当 StatefulWidget 被调用时会立即执行 createState 。
-
initState ,该函数为 State 初始化调用,因此可以在此期间执行 State 各变量的初始赋值,同时也可以在此期间与服务端交互,获取服务端数据后调用 setState 来设置 State。
-
didChangeDependencies ,该函数是在该组件依赖的 State 发生变化时,这里说的 State 为全局 State ,例如语言或者主题等,类似于前端 Redux 存储的 State 。
-
build ,主要是返回需要渲染的 Widget ,由于 build 会被调用多次,因此在该函数中只能做返回 Widget 相关逻辑,避免因为执行多次导致状态异常。
-
reassemble ,主要是提供开发阶段使用,在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。
-
didUpdateWidget ,该函数主要是在组件重新构建,比如说热重载,父组件发生 build 的情况下,子组件该方法才会被调用,其次该方法调用之后一定会再调用本组件中的 build 方法。
-
deactivate ,在组件被移除节点后会被调用,如果该组件被移除节点,然后未被插入到其他节点时,则会继续调用 dispose 永久移除。
-
dispose ,永久移除组件,并释放组件资源。
测试用例
日志结果
flutter: create state
flutter: init state
flutter: did change dependencies
flutter: build
flutter: reassemble
flutter: did update widget
flutter: build
示例:
import 'package:flutter/material.dart';
/// 创建有状态测试组件
class TestStatefulWidget extends StatefulWidget {
@override
createState() {
print('create state');
return TestState();
}
}
/// 创建状态管理类,继承状态测试组件
class TestState extends State<TestStatefulWidget> {
/// 定义 state [count] 计算器
int count = 1;
/// 定义 state [name] 为当前描述字符串
String name = 'test';
@override
initState() {
print('init state');
super.initState();
}
@override
didChangeDependencies() {
print('did change dependencies');
super.didChangeDependencies();
}
@override
didUpdateWidget(TestStatefulWidget oldWidget) {
count++;
print('did update widget');
super.didUpdateWidget(oldWidget);
}
@override
deactivate() {
print('deactivate');
super.deactivate();
}
@override
dispose() {
print('dispose');
super.dispose();
}
@override
reassemble(){
print('reassemble');
super.reassemble();
}
/// 修改 state name
void changeName() {
setState(() {
print('set state');
this.name = 'flutter';
});
}
@override
Widget build(BuildContext context) {
print('build');
return Column(
children: <Widget>[
FlatButton(
child: Text('$name $count'), // 使用 Text 组件显示描述字符和当前计算
onPressed:()=> this.changeName(), // 点击触发修改描述字符 state name
)
],
);
}
}
如何触发组件再次 build
- 1.setState
state数据变化时,调用 setState((){});
- 2.didChangeDependencies
如果当前 widget 所依赖的全局 state 的值发生了变化,(比如,路由,主题颜色,地区语言,或者全局变量 ),那么就会触发此生命周期函数,而该函数执行之后就会触发 build 操作。
- 3.didUpdateWidget
- 4.组件销毁触发