当前位置: 首页 > news >正文

Flutter 生命周期介绍

在 Flutter 应用开发过程中,理解生命周期管理至关重要,它们直接影响应用的性能、用户体验和开发效率。

Flutter 组件生命周期

StatelessWidget 与 StatefulWidget 的生命周期区别

在 Flutter 中,组件根据生命周期不同主要分为两种:StatelessWidgetStatefulWidget。名称已经很好地表明了这两个组件的差别:一个有状态,一个无状态。

StatelessWidget 是不可变的,一旦构建完成,其内容就不会改变,除非父组件发生变化。这种组件适用于不需要维护状态的场景,如纯展示型组件。而 StatefulWidget 则允许状态变化,能够响应用户交互和数据更新。

StatelessWidget 的生命周期

StatelessWidget 是不可变的,这意味着它们的属性不能变化,所有的值都是最终的,可以理解为将外部传入的数据转化为界面展示的内容,只会渲染一次。 StatelessWidget 的生命周期相对简单,只有 build 方法。当外部依赖变化时,它会重新构建,不会保存任何内部状态。这意味着每当父组件发生变化时,整个 StatelessWidget 都会被重新创建。

StatefulWidget 的生命周期

StatefulWidget 是 Flutter 中用于构建有状态 UI 的类。StatefulWidget 主要用于需要动态更新的场景,例如用户交互、动画或异步数据处理等。它本身并不存储状态,而是通过与其关联的 State 对象来管理状态。State 是与 StatefulWidget 关联的对象,用于保存和管理 StatefulWidget 的状态信息。

每个 StatefulWidget 都会对应一个 State 对象。这种关联通过 StatefulWidgetcreateState() 方法实现,该方法返回一个 State 对象。StatefulWidget 负责定义 UI 的静态部分,如布局和初始配置。State 负责动态部分的管理维护,包括状态变化时的 UI 更新。

State 定义了 StatefulWidget 的生命周期方法,如 initState()didUpdateWidget()dispose()等,用于在不同阶段执行特定的逻辑。所以 StatefulWidget 的生命周期,除了 createState() 方法用于创建 State 对象,其余的方法其实是 State 的生命周期方法。

  1. createState: 创建与 StatefulWidget 相关联的状态对象,当 StatefulWidget 被创建时会立即执行 createState。这个方法在 StatefulWidget 的生命周期中可能会被多次调用,例如当一个 StatefulWidget 同时插入到 Widget 树的多个位置时。createState 函数执行完毕后表示当前组件已经在 Widget 树中,此时有一个非常重要的属性 mounted 被置为 true。
  2. initState: 该函数为 State 初始化时调用,只会被调用一次,因此,通常会在该方法中做一些一次性的操作,如执行 State 各变量的初始赋值、订阅事件通知、获取服务端数据后调用 setState 来设置 State
  3. didChangeDependencies: 在 initState() 之后立即调用,并且当组件依赖的对象发生变化时也会被调用。这个方法用于处理依赖变化。当 State 对象的依赖的 InheritedWidget 关系发生变化时,该方法被调用。而这个依赖指的就是子 widget 是否使用了父 widgetInheritedWidget 的数据!如果使用了,则代表子 widget 有依赖;如果没有使用则代表没有依赖。可以参考这篇文章 Flutter原理篇:didChangeDependencies什么时候被调用
  4. build: 构建 UI 的方法,返回需要渲染的 Widget,会被多次调用。当组件需要渲染或更新时,这个方法会被调用。在该函数中不要做除创建 Widget 之外的操作,会影响 UI 的渲染效率。
  5. reassemble: 主要在开发阶段使用,在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。此回调在 release 模式下永远不会被调用。
  6. didUpdateWidget: 当父组件改变其配置并需要该组件重建时调用。它接收旧组件作为参数,允许与新组件进行比较。这个方法用于处理组件配置的变化。
  7. deactivate: 当 State 对象从 Widget 树中被移除或移动时被调用。如果 State 对象在同一帧期间被移动了且它有 GlobalKey,那么它仍然能够被激活。
  8. dispose: 当 State 对象从 Widget 树中被永久移除时调用。这个方法用于释放资源、取消订阅或执行其他清理任务。调用完 dispose 后,mounted 属性被设置为 false,也代表组件生命周期的结束。
生命周期中重要的概念
  • mounted: 是 State 中的一个重要属性,相当于一个标识,用来表示当前组件是否在 Widget 树中。在 createState 方法后,mounted 会被置为 true,表示当前组件已经在树中。调用 dispose 方法后,mounted 被置为 false,表示当前组件不在树中。
  • dirty: 表示当前组件状态的一个重要属性,下一帧时将会执行 build 函数,调用 setState 方法或者执行 didUpdateWidget 方法后,组件的状态为 dirty
  • clean: 与 dirty 相对应,clean 状态下组件不会执行 build 函数。
生命周期流程图

生命周期流程图

Flutter 应用生命周期

应用生命周期状态

Flutter 应用有五种生命周期状态,可见 AppLifecycleState 枚举值

  1. detached: 应用仍由 Flutter 引擎托管,但与任何主机视图分离。应用在初始化之前默认为此状态,并且在分离所有视图后可以处于此状态(适用于 Android、iOS 和 Web)。当应用处于此状态时,引擎在没有视图的情况下运行。此状态仅在 iOS、Android 和 Web 上会进入,但在所有平台上,它是应用开始运行之前的默认状态。一般不严谨要求的情况下,可以简单用于退出应用的状态监听。
  2. resumed: 在所有平台上,此状态表示应用处于具有输入焦点且可见的正在运行的状态。
  3. inactive: 应用至少一个视图是可见,但没有一个视图具有输入焦点。在 Android 和 iOS 上, inactive 可以认为它们马上会进入 hiddenpaused 状态。
  4. hidden: 应用的所有视图都处于隐藏状态。在 iOS 和 Android 上说明即将进入 paused 状态,在 PC 上说明已被最小化或放置在不再可见的桌面上,在 Web 上说明在不再可见的窗口或选项卡中。在 iOS 和 Android 上,为了保持状态机在所有平台上的相同性,在从 inactive 进入 paused 状态之前,以及从 paused 进入 inactive 状态之前,合成到此状态的转换。
  5. paused: 应用当前对用户不可见,并且不响应用户行为。当应用处于此状态时,引擎不会调用 PlatformDispatcher.onBeginFramePlatformDispatcher.onDrawFrame 回调。仅在 iOS 和 Android 上会进入此状态。

应用生命周期管理

WidgetsBindingObserver

WidgetsBinding.instance 在 Flutter 中用于管理应用程序的事件循环和处理各种事件,例如布局、绘制、手势和系统事件。它是 WidgetsBinding 类的一个单例实例,通过它可以访问应用程序的根 WidgetsBinding 对象。

WidgetsBinding 包含了以下常用的功能:

  1. 事件循环管理: WidgetsBinding 负责管理 Flutter 应用程序的事件循环,它处理了各种事件的分发和调度。包括 build、layout、paint等事件。
  2. 处理系统事件: WidgetsBinding 可以处理系统级事件,例如按键事件、触摸事件、指针事件等。
  3. 定时器和帧回调WidgetsBinding 允许注册定时器和帧回调,以便在未来的时间点执行代码或在下一帧绘制前执行代码。
  4. 状态管理: WidgetsBinding 管理应用程序的生命周期状态,这有助于应用程序在不同状态下进行适当的处理。
  5. 媒体和屏幕分辨率信息: WidgetsBinding 提供了访问媒体查询(MediaQuery)和屏幕信息的方法,以便根据屏幕属性调整 UI。
  6. 错误处理: WidgetsBinding 处理了 Flutter 应用程序中的异常和错误,允许注册全局错误处理程序。
  7. BuildContext: WidgetsBinding 提供了根 BuildContext,可以用于构建全局部件。

使用 WidgetsBindingObserverdidChangeAppLifecycleState 来实现应用生命周期的监听。使用的时候需要把整个 WidgetsBindingObserver 通过 mixin 引入,然后 WidgetsBinding.instance.addObserver(this) 注册监听,在 didChangeAppLifecycleState 方法中就能收到应用生命周期各个状态的回调,注意别忘记离开时要移除监听WidgetsBinding.instance.removeObserver(this)

didChangeAppLifecycleState

AppLifecycleListener

详细介绍可以参考这篇文章 Flutter 小技巧之 3.13 全新生命周期 AppLifecycleListener

在 Flutter 3.13及其之后版本,可以通过 AppLifecycleListener 管理应用生命周期。AppLifecycleListener 是在 WidgetsBindingObserver.didChangeAppLifecycleState 的基础上进行了封装,再配合当前 lifecycleState 形成更完整的生命周期链条,对于开发者来说就是使用更方便,并且 API 相应更直观。

AppLifecycleListener

首先 AppLifecycleListener 是一个完整的类,所以使用它无需使用 mixin ,你只需要在使用的地方创建一个 AppLifecycleListener 对象即可。

其次,AppLifecycleListener 根据 AppLifecycleState 区分好了所有 Callback 调用,调用编排更加直观。

最后,AppLifecycleListener 可以更方便去判断和记录整个生命周期的链路变化,因为它已经帮忙封装好了回调方法。

在这里插入图片描述

http://www.dtcms.com/a/301062.html

相关文章:

  • 2507C++,结构化存储与复合文件
  • JavaWeb(苍穹外卖)--学习笔记13(微信小程序开发,缓存菜品,Spring Cache)
  • epoll_event 事件类型详解
  • Python折线图
  • Spring 核心流程
  • 问津集 #2:High Compression and Fast Search on Semi-Structured Logs
  • 网络基础19:OSPF多区域实验
  • 小黑课堂计算机二级 WPS Office题库安装包2.52_Win中文_计算机二级考试_安装教程
  • C++算法竞赛篇(五)循环嵌套题型讲解
  • java开闭原则 open-closed principle
  • 商品中心—1.B端建品和C端缓存
  • 内网服务器实现从公网穿透
  • NVMe高速传输之摆脱XDMA设计16:队列管理模块设计(上)
  • Python 列表推导式与生成器表达式
  • 激光SLAM技术综述(2025版)
  • Python入门构建网页
  • Linux驱动20 --- FFMPEG视频API
  • 基于Django的天气数据可视化分析预测系统
  • Coze:字节跳动AI开发平台功能和架构解析
  • 第五章 中央处理器(CPU)知识体系与考法总结
  • 虚拟机ubuntu20.04共享安装文件夹
  • ubuntu 部署 coze-loop
  • C语言函数递归详解
  • 运行时长和内存优化:混合精度训练(MPT)案例和梯度检查点(GCP)
  • LWGJL教程(6)——GL20源码
  • Python初学OpenCV:图像预处理进阶指南(二)
  • 使用frp实现免费内网穿透
  • 【2025CVPR-扩散模型方向】TKG-DM:免训练的色度关键内容生成扩散模型
  • 区块链:工作量证明与联邦学习
  • ArkTS 模块通信全解析:用事件总线实现页面消息联动