跳转至

生命周期

生命周期就是回调方法,封装好的Widget处于什么状态,抽象方法让你实现。

作用:

  • 初始化数据
  • 创建变量、常量
  • 发送网络数据
  • 监听小部件的事件
  • 管理内存
  • 销毁数据、销毁监听者
  • 销毁timer等等

1、StatelessWidget

class LifeCycle extends StatelessWidget {
  const LifeCycle({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return const Center(
      child: Text('123'),
    ); 
  }
}
  1. StatelessWidget的构造方法
  2. StatelessWidget的bulid方法

2、StatefulWidget

class MyHomePage extends StatefulWidget {
  final String? title;
  MyHomePage({Key? key, this.title}) : super(key: key) {
    print('StatefulWidget构造函数被调用了!');
  } //构造方法

  @override
  _MyHomePageState createState() {
    print('StatefulWidgetd的createState方法被调用了!');
    return _MyHomePageState();
  }
}

class _MyHomePageState extends State<MyHomePage> {
  int _count = 0;

  _MyHomePageState() {
    print('State的构造方法被调用了!');
  }

  @override
  void initState() {
    print('State的init方法被调用了!');
    super.initState();
    //初始化数据。。。
  }

  //改变依赖关系
  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    print('State的didChangeDependencies被调用了');
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    print('State的bulid方法被调用了!');
    // return Center(
    //   child: Text(widget.title ?? '123'),
    // ); // !强制解包  ??如果为空 用右边的
    return Column(
      children: [
        ElevatedButton(
            onPressed: () {
              _count++;
              // setState(() {});//等于下面
              context as StatefulElement;
              context.markNeedsBuild();
            },
            child: const Icon(Icons.add)),
        Text('$_count') //staless就加const
      ],
    );
  }

  @override
  void dispose() {
    print('State的dispose方法被调用了!');
    super.dispose();
  }

  //State从渲染树中移除的时候调用
  @override
  void deactivate() {
    // TODO: implement deactivate
    print('State的deactivate方法被调用了!');
    super.deactivate();
  }
}

StatefulWidget

  1. StatefulWidget的构造函数

  2. createState方法

State

  1. State的构造方法

  2. initState

每次页面进来都走一次,创建state的时候走一次,切换页面会重新创建。解决内存,渲染树中会自动处理。

不要把部件创建放这里,这里面放数据,网络请求。

  1. didChangeDependencies方法

改变依赖关系

build方法之前

依赖(共享数据)的InheritedWidget发生变化之后,didChangeDependencies才会调用。

数据变了的处理。例如:点赞收藏等 需要保存 还需要请求网络

  1. State的bulid方法

build方法里面创建部件。

当调用setState方法,会重新调用Build进行渲染。

  1. deactivate

State从渲染树中移除的时候调用

  1. dispose方法:void dispose()

页面切换销毁。释放资源。

  1. didUpdateWidget
  @override
  void didUpdateWidget(covariant IconWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.typeCode != oldWidget.typeCode ||
        widget.iconName != oldWidget.iconName) {
      setState(() {
        typeCode = widget.typeCode;
        iconName = widget.iconName; // Reset iconName if needed
      });
    }
  }

setState()方法

每次调用setState()方法更改状态都会重新走build方法

只要数据改变就手动调用一下,然后会调用build刷新UI,增量渲染。

setState方法内部主要是利用_element(本质就是context对象)调用markNeedsBuild

@protected
void setState(VoidCallback fn) {
  /**
  一系列判断
  */
  _element!.markNeedsBuild();//标记需要被渲染
}

_element

context就是_element

BuildContext get context {
  assert(() {
    if (_element == null) {
      throw FlutterError(
        'This widget has been unmounted, so the State no longer has a context (and should be considered defunct). \n'
        'Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.',
      );
    }
    return true;
  }());
  return _element!;
}
StatefulElement? _element;
setState(() {});
//等于下面
context as StatefulElement;
context.markNeedsBuild();