Flutter Stateless 与 Stateful 组件生命周期小记
无状态小部件及其生命周期
无状态组件不携带任何内部状态,其 build
方法仅在创建时在该组件内运行一次。Stateless Widget 中的数据是不可变的,即它们不能被更改,除非该小部件本身的新实例再次使用不同的配置和属性进行初始化。通常用于应用程序中的常量组件,即组件仅依赖本身的配置信息,如 AppBar 或配色方案。
1class HomePage extends StatelessWidget {
2@override
3 Widget build(BuildContext context) {
4 return Container(
5 // 写你的代码..
6 );
7 }
8}
有状态的小部件及其生命周期
当您描述的用户界面部分需要动态更改时,有状态组件将很有用。例如,需要根据内部时钟或某些系统状态改变显示内容。
createState
当 Flutter 被指示构建 StatefulWidget 时,它会立即调用 createState()。
1class MyHomePage extends StatefulWidget {
2 @override
3 _MyHomePageState createState() => _MyHomePageState();
4}
mounted
当 createState 创建状态类时,会为该状态分配一个 BuildContext。所有小部件都有一个 mounted 属性,其在分配 BuildContext 后变为真。
initState
这是创建小部件时调用的第一个方法(当然是在类构造函数之后),其在组件整个生命周期中只被调用一次。
1@override
2void initState() {
3 super.initState();
4 // TODO: implement initState
5}
didChangeDependencies
initState 在第一次构建小部件后立即调用此方法。
1@override
2 void didChangeDependencies() {
3 // TODO: implement didChangeDependencies
4 super.didChangeDependencies();
5 }
build
这是一个必需且被覆盖的方法,每次重建小部件时都会触发该方法。
1@override
2Widget build(BuildContext context) {
3 return Container(color:Colors.red);
4}
didUpdateWidget
如果父组件发生变化并且必须重建这个小部件(因为父级需要传递不同的数据),但是它正在用相同的 runtimeType 重建,那么这个方法会被调用。因为 Flutter 正在重用状态,这是长期存在的。在这种情况下,您可能需要再次初始化一些数据,就像在 initState 一样。
1@override
2void didUpdateWidget(Home oldWidget) {
3 super.didUpdateWidget(oldWidget);
4 // TODO: implement didUpdateWidget
5}
setState
这个方法经常被框架本身和开发者调用,它用于通知框架数据已更改(进行标记)。在 setState 之外更改状态不会触发构建方法来重建 UI,同时 setState 不接受异步回调。
1setState(() {
2 // setState implementation
3});
deactivate()
当从树中删除 State 时被调用,但它可能会在当前帧更改完成之前重新插入。这种方法的存在基本上是因为 State 对象可以从树中的一个点移动到另一个点。
此方法的实现应以调用继承方法 super.deactivate() 结束。
1@override
2void deactivate() {
3 super.deactivate();
4 // TODO: implement deactivate
5}
dispose
当 State 对象被移除时调用 dispose ,这是永久性的。此方法是您应该取消订阅和取消所有动画、流等的地方。
1@override
2void dispose() {
3super.dispose();
4// TODO: implement dispose
5}