当前位置: 首页 > 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.xdnf.cn/news/1199413.html

相关文章:

  • 基于Java的KTV点歌系统的设计与实现
  • 电商项目_核心业务_分布式ID服务
  • [STM32][HAL]stm32wbxx 超声波测距模块实现(HY-SRF05)
  • selenium完整版一览
  • 三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡
  • git 提交时排除一个或多个文件
  • 【H264视频编码】一、基本概念
  • 沪深L2逐笔十档委托队列分时Tick历史数据分析处理
  • 集合框架学习
  • day25
  • vulkan从小白到专家——YUV处理
  • Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法
  • 《谁在翻译机器的疼痛?》——故障诊断的认知鸿沟与产教破壁之战!
  • C++ 多线程(一)
  • 低精度训练一:低精度训练介绍与大模型下载
  • 09_opencv_遍历操作图像像素
  • net8.0一键创建支持(RabbitMQ)
  • 【AI论文】WebShaper:通过信息寻求形式化实现主动式数据合成
  • 深入理解Java内存与运行时机制:从对象内存布局到指针压缩
  • 【C++】红黑树实现
  • n8n “Run Once for All Items“和“Run Once for Each Item“区别
  • 基于Springboot+UniApp+Ai实现模拟面试小工具七:前端项目创建及框架搭建
  • cJSON在STM32单片机上使用遇到解析数据失败问题
  • Java面试全栈通关:从微服务到AI的技术深度解析
  • 一文读懂 JWT(JSON Web Token)
  • 【LeetCode刷题指南】--设计循环队列
  • 怎样让阿里云服务器(centos)有界面
  • 机械学习----knn实战案例----手写数字图像识别
  • Kotlin位运算
  • 板凳-------Mysql cookbook学习 (十二--------3_3)