• 深入理解Flutter组件的生命周期
  • 发布于 2个月前
  • 286 热度
    0 评论
  • 顾及谁
  • 24 粉丝 32 篇博客
  •   
前言

了解 widget 生命周期,对我们开发组件还是很重要的。今天会把无状态、有状态组件的几个生命周期函数一起过下。


Stateless
无状态组件比较简单就是一个 build 函数,每次外部新状态压入,进行调用。
class TitleWidget extends StatelessWidget {
  const TitleWidget({super.key, required this.title});

  final String title;

  @override
  Widget build(BuildContext context) {
    return Text(title);
  }
}

步骤
createState 创建状态
当您创建一个statefulWidget时,这将自动创建。
  @override
  State<CounterWidget> createState() => _CounterWidgetState();
initState 初始化状态
在小部件创建之前和构建方法之前调用。
一般用来初始状态数据
  int _counter = 0;

  @override
  void initState() {
    print('initState');
    super.initState();
    _counter = 10;
  }
didChangeDependencies 依赖改变
当每个依赖项更改此状态时,调用此方法。
在构建小部件的第一次调用initState()之后,也可以立即调用它。
  @override
  void didUpdateWidget(covariant CounterWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }
deactivate 停用
当小部件暂时从小部件树中移除时,将调用此方法。
  @override
  void deactivate() {
    print('deactivate');
    super.deactivate();
  }
dispose 释放资源
当小部件从小部件树中永久移除时
  @override
  void dispose() {
    print('dispose');
    super.dispose();
  }
完整代码
// ignore_for_file: avoid_print
// 堆代码 duidaima.com
import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  const CounterWidget({super.key, required this.title});

  final String title;

  // 1. 创建状态
  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  // 2. 初始化状态
  // 在小部件创建之前和构建方法之前调用
  @override
  void initState() {
    print('initState');
    super.initState();
    _counter = 10;
  }

  // 3. 当每个依赖项更改此状态时,调用此方法
  // 在构建小部件的第一次调用initState()之后,也可以立即调用它。
  @override
  void didChangeDependencies() {
    print('didChangeDependencies');
    super.didChangeDependencies();
  }

  // 4. 当小部件重新构建时,将调用此方法。
  // 这个用于取消订阅在initState()中订阅的旧对象,
  // 并在更新的小部件配置需要替换对象时订阅新对象。
  @override
  void didUpdateWidget(covariant CounterWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }

  // 5. 停用
  // 当小部件暂时从小部件树中移除时,将调用此方法。
  @override
  void deactivate() {
    print('deactivate');
    super.deactivate();
  }

  // 6. 释放资源
  // 当小部件从小部件树中永久移除时
  @override
  void dispose() {
    print('dispose');
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    print('build');

    return Column(
      children: [
        // 标题
        Text(widget.title),

        // 计数
        ElevatedButton(
          onPressed: () {
            setState(() {
              _counter++;
            });
          },
          child: Text('counter > $_counter'),
        ),
      ],
    );
  }
}
小结
1.了解小部件的生命周期非常重要,这样你就可以编写高效且节省内存的代码。通过了解生命周期,你可以避免创建不必要的对象和资源。
2.尽可能使用无状态小部件。无状态小部件比有状态小部件更高效和节省内存。
3.只有在需要更新小部件的状态时才使用有状态小部件。
4.尽量避免不必要地调用 setState() 。调用 setState() 会导致 build() 方法再次被调用,这可能会造成额外的开销。
5.当您的小部件不再需要时,请处理掉它们使用的任何资源。这将有助于防止内存泄漏。

用户评论