🍉 加载中...


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

4 minute read

组件生命周期示意图

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

无状态组件不携带任何内部状态,其 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}

参考资料