Flutter Widget页面生命周期:
StatelessWidget 只有createElement,build两个生命周期方法。
StatefullWidget 的生命周期按照时期不同,分为三组:
1. 初始化时期:createState、initState
- createState: 当创建一个新的StatefullWidget时,会立即调用,该方法必须被覆盖。
- initState: 创建widget调用的除构造方法外的第一个方法。类似Android的onCreate与iOS的viewDidLoad
通常做一些初始化工作,比如channel的初始化,监听器的初始化等。
2. 更新时期:didChangeDependencies、build、didUpdateWidget
- didChangeDependencies():当依赖的State对象改变时会调用:
a:在第一次构建widget时,在initState()之后立即调用此方法;
b:如果StatefulWidget依赖于InhertedWidget,那么当当前State所依赖的InhertedWidget的变量改变时调用。
/// 拓展:InhertedWidget可高效率的将数据在Widget树中向下传递,共享。
- build():这是一个必须要实现的方法,这里实现要呈现的页面内容。
a:在didChangeDependencies()之后立即调用;
b:另外当调用setState后也会再次调用该方法刷新UI。
- didUpdateWidget(WidgetLifecycle oldWidget):
当父组件需要重绘的时候调用,是一个不常用的生命周期方法。
/// if(oldWidget.xxx != widget.xxx)...
3. 销毁期:deactivete、dispose
- deactivete(): 不常用的生命周期方法。在组件被移除时调用,且是在dispose之前调用。
- dispose(): 组件被销毁时调用,一般用于执行资源的释放工作(监听器卸载、channel的销毁等)。
打开页面:依次调用initState --> didChangeDependencies --> build方法。
销毁页面:依次调用deactivete --> dispose方法。
Flutter 应用的生命周期:
WidgetsBindingObserver:是一个Widgets绑定观察器,通常可以监听应用的生命周期,语言的变化等。
class AppLifecycle extends StatefulWidget {
const AppLifecycle({Key? key}) : super(key: key);
@override
State<AppLifecycle> createState() => _AppLifecycleState();
}
/// 如何获取Flutter应用维度的生命周期。
/// WidgetsBindingObserver:是一个Widgets绑定观察器,通常可以监听应用的生命周期,语言的变化等。
class _AppLifecycleState extends State<AppLifecycle> with WidgetsBindingObserver {
@override
void initState() {
// 添加监听器。生命周期变化,会回调到didChangeAppLifecycleState方法。
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Flutter应用维度的生命周期')),
body: Container(child: Text('应用维度的生命周期')),
);
}
// 监听应用维度的生命周期变化。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print('state = $state');
if (state == AppLifecycleState.paused) {
print("app进入后台:paused");
} else if (state == AppLifecycleState.resumed) {
print("app进入前台:resumed");
} else if (state == AppLifecycleState.inactive) {
// 不常用:应用程序处于非活动状态,并且为接收用户输入时调用,比如:来电话了。
print("app inactive");
// } else if (state == AppLifecycleState.suspending) {
// // 不常用:应用程序被挂起时调用,它不会在iOS上触发。只在Android上触发
// print("app suspending");
}
}
}