Flutter Stateless 与 Stateful 组件生命周期小记

组件生命周期示意图

无状态小部件及其生命周期

无状态组件不携带任何内部状态,其 build 方法仅在创建时在该组件内运行一次。Stateless Widget 中的数据是不可变的,即它们不能被更改,除非该小部件本身的新实例再次使用不同的配置和属性进行初始化。通常用于应用程序中的常量组件,即组件仅依赖本身的配置信息,如 AppBar 或配色方案。

1
2
3
4
5
6
7
8
class HomePage extends StatelessWidget { 
@override 
  Widget build(BuildContext context) { 
    return Container( 
        // 写你的代码.. 
    ); 
  } 
}

有状态的小部件及其生命周期

当您描述的用户界面部分需要动态更改时,有状态组件将很有用。例如,需要根据内部时钟或某些系统状态改变显示内容。

组件生命周期示意图

createState

当 Flutter 被指示构建 StatefulWidget 时,它会立即调用 createState()。

1
2
3
4
class MyHomePage extends StatefulWidget {
    @override
    _MyHomePageState createState() => _MyHomePageState();
}

mounted

当 createState 创建状态类时,会为该状态分配一个 BuildContext。所有小部件都有一个 mounted 属性,其在分配 BuildContext 后变为真。

initState

这是创建小部件时调用的第一个方法(当然是在类构造函数之后),其在组件整个生命周期中只被调用一次

1
2
3
4
5
@override
void initState() {
    super.initState();
    // TODO: implement initState 
}

didChangeDependencies

initState 在第一次构建小部件后立即调用此方法。

1
2
3
4
5
@override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
  }

build

这是一个必需且被覆盖的方法,每次重建小部件时都会触发该方法。

1
2
3
4
@override
Widget build(BuildContext context) {
   return Container(color:Colors.red);
}

didUpdateWidget

如果父组件发生变化并且必须重建这个小部件(因为父级需要传递不同的数据),但是它正在用相同的 runtimeType 重建,那么这个方法会被调用。因为 Flutter 正在重用状态,这是长期存在的。在这种情况下,您可能需要再次初始化一些数据,就像在 initState 一样。

1
2
3
4
5
@override
void didUpdateWidget(Home oldWidget) {
  super.didUpdateWidget(oldWidget);
    // TODO: implement didUpdateWidget
}

setState

这个方法经常被框架本身和开发者调用,它用于通知框架数据已更改(进行标记)。在 setState 之外更改状态不会触发构建方法来重建 UI,同时 setState 不接受异步回调。

1
2
3
setState(() {
    // setState implementation 
});

deactivate()

当从树中删除 State 时被调用,但它可能会在当前帧更改完成之前重新插入。这种方法的存在基本上是因为 State 对象可以从树中的一个点移动到另一个点。

此方法的实现应以调用继承方法 super.deactivate() 结束。

1
2
3
4
5
@override
void deactivate() {
    super.deactivate();
    // TODO: implement deactivate
}

dispose

当 State 对象被移除时调用 dispose ,这是永久性的。此方法是您应该取消订阅和取消所有动画、流等的地方。

1
2
3
4
5
@override
void dispose() {
super.dispose();
// TODO: implement dispose
}

参考资料