flutter 生命周期详解
- 简介
- 一、widget 生命周期
- 二、APP 生命周期
- 总结
简介
众所周知,程序是有生命周期的,那么flutter 的生命周期是什么呢?
flutter 的生命周期大体可分为三大阶段:初始化阶段、状态变化阶段、销毁阶段。
然而在这三个阶段中,又分如下两个部分:
- widget 生命周期
- APP 生命周期
一、widget 生命周期
在widget 生命周期中,又分为两大类:
- StatelessWidget 无状态组件
StatelessWidget 的生命周期,只有build 过程。build 是用来创建widget 的,每次在页面刷新时都会调用。 - StatelessFulWidget 有状态组件
StatelessFulWidget 的生命周期,我们可以从上面的图中,直接看出来,下面简单的记录一下
- createState:StatelessFulWidget中创建state 的方法,当StatelessFulWidget 被调用时会立即执行 createState。
- initState:state 初始化时调用,我们大多数都是这个方法中执行state 变量的初始赋值等操作,如:和服务器做交互,返回数据使用 setState() 来设置state ,而且initState 只会执行一次。
- didChangeDependcies:会在 initState 后立即执行,之后会在依赖的state 发生变化后执行,这里的state 指的是InheritedWidget,所以didChangeDependcies 会执行多次。
- build:会在didChangeDependcies 执行之后立即执行,之后会在setState() 方法刷新时,会再次调用build 方法,进行页面重新绘制。build 也会执行多次,由于build 会多次调用,所以只能做返回 widget 的函数,避免多次执行导致程序状态异常。
- addPostFrameCallback: addPOSTFragmentCallback 是 StatelessFulWidget 渲染结束之后的回调,只会调用一次,一般的是initState 中添加回调方法
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
- didUpdateWidget: 主要是在组件重新构建时调用,比如热重装,父组件发生 build 的情况下,子组件该方法才会被调用,其次该方法调用之后一定会再调用本组件中的 build 方法。
- deactivate: 在组件移除结点时调用,如果该组件被移除结点,然后没有插入到其他的结点上时,该组件将会调用 dispose 永久移除。
- dispose: 永久移除组件,并释放资源。
整个生命周期的过程大致可以分成四个部分:
- 初始化阶段,包括两个生命周期函数 createState 、initState
- 组件创建阶段,包括两个生命周期函数 didChangeDependcies 、build
- 触发多次 build,这个阶段可能是由 didChangeDependencies、setState 或者 didUpdateWidget 而引发的组件重新 build ,在组件运行过程中会多次被触发,这也是优化过程中需要着重需要注意的点
- 组件销毁阶段,包括两个生命周期函数 deactivate、dispose
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
)
],
);
}
}
二、APP 生命周期
APP 的生命周期通过 WidgetsBindingObserver 的 didChangeAppLifecycleState 来获取。通过该接口可以获取是生命周期在AppLifecycleState类中。
AppLifecycleState就是App的生命周期,包含四个:
- resumed:可见并能相应用户的输入,同安卓中的onResume
- inactive:处于并不活跃的状态,无法处理用户响应,同安卓中的onPause
- **paused:**不可见并不能响应用户的输入,但是在后台继续活动中,同安卓的onStop
APP 生命周期调试方式:
初次打开widget时,不执行AppLifecycleState的回调;
按home键或Power键, AppLifecycleState inactive ----> AppLifecycleState pause
从后台到前台:AppLifecycleState inactive —> ApplifecycleState resumed
back键退出应用: AppLifecycleState inactive —> AppLifecycleState paused
总结
本篇文章记录了flutter 中的两个主要生命周期,每个周期的实际意义,这样我们就可以在项目不断的阶段,做不同的操作了,感谢大家的检阅。