一、说明

我们在开发 Android 或 iOS 中经常会用到页面的生命周期。

Android Activity 生命周期:

  • onCreate
  • onStart
  • onResume
  • onPause
  • onStop
  • onRestart
  • onDestroy

iOS ViewController 生命周期:

  • viewDidLoad
  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear
  • viewDidUnload

我们可以通过这些生命周期初始化我们的逻辑(onCreate 或 viewDidLoad),也可以很方便的监听页面的显示与隐藏(resume、pause、Will/Did Appear/Disappear)。

从原生转向 Flutter 后,估计你会有以下问题:

  1. Flutter 的生命周期是什么?
  2. 应该将我们的业务逻辑写到哪个方法中 ?
  3. 怎样监听页面的显示与隐藏?

二、图示 Flutter 生命周期

Flutter 生命周期分为 App 的生命周期和 Widget 的生命周期。

  • 橙色部分为 App 生命周期。
  • 其它部分为 Widget 生命周期。

三、App 生命周期

App 的生命周期是用来监听 App 前后台切换等生命周期的。

1、监听 App 生命周期

第 1 步:with WidgetsBindingObserver

class _MyScreenState extends State<MyScreen> with WidgetsBindingObserver

第 2 步:在 initState 添加如下代码

WidgetsBinding.instance.addObserver(this);

第 3 步:在 dispose 中添加如下代码

WidgetsBinding.instance.removeObserver(this);

第 4 步:状态监听

@override
void didChangeAppLifecycleState(AppLifecycleState state) {super.didChangeAppLifecycleState(state);if (state == AppLifecycleState.paused) {// The application is not currently visible to the user, not responding to// user input, and running in the background.// 不可见,不可操作}if (state == AppLifecycleState.resumed) {// The application is visible and responding to user input.// 可见,可操作}if (state == AppLifecycleState.inactive) {// The application is in an inactive state and is not receiving user input.// 可见,不可操作}if (state == AppLifecycleState.detached) {// The application is still hosted on a flutter engine but is detached from any host views.// 虽然还在运行,但已经没有任何存在的界面。}
}

注意:didChangeAppLifecycleState 管理的生命周期并不是像 Android 那样页面切换的生命周期,而是监听点击 home、物理返回键、屏幕锁定和解锁。

2、使用场景:

场景 1:前台转后台:

  1. AppLifecycleState.inactive
  2. AppLifecycleState.paused

场景 2:后台转前台:

  1. AppLifecycleState.inactive
  2. AppLifecycleState.resumed

四、Widget 生命周期方法

说起 Widget 生命周期,主要分为 StatefullWidget 的生命周期和 StatelessWidget 的生命周期,由于 StatelessWidget 的生命周期比较简单,它只有一个 build 方法,我们在这儿就不做过多关注了,以下我们主要分析 StatefullWidget 的生命周期。

1、生命周期说明

  1. constructor:构造函数
  2. createState:createState 是 StatefulWidget 里创建 State 的方法,当要创建新的 StatefulWidget 的时候,会立即执行 createState,而且只执行一次。
  3. initState:这个方法是组件创建后的第一个方法,它相当于原生的 onCreate 和 viewDidLoad,大部分页面初始逻辑调用会写到这个方法中。
  4. didChangeDependencies:当 State 对象的依赖发生变化时会被调用。例:你的 StatefulWidget 依赖一个 InheritedWidget 的数据,当数据发生变化时,会调用子 Widget 的该方法。第一次打开页面时 initState 之后会立刻调用该方法。
  5. didUpdateWidget:当父组件改变并且需要重新绘制 UI 时,这个方法会调用。通过这个方法,你可以通过参数获取到旧的组件,你可以通过对比新旧组件后做一些额外的逻辑。
  6. build:这个方法是最为重要的一个方法,它用来构建你的整个组件树。
  7. deactivate:当 State 对象从树中被移除时,会调用此回调。有些情况下,framework 会将该 State 插入到树的其它部分。
  8. dispose:当 State 对象从树中被永久移除时调用。通常在此回调中释放资源。
  9. reassemble:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在 Release 模式下永远不会被调用。

2、使用场景

场景 1:打开页面:

  1. constructor
  2. createState
  3. initState
  4. didChangeDependencies
  5. build

场景 2:退出页面:

  1. deactivate
  2. dispose

场景 3:热重载:

  1. reassemble
  2. didUpdateWidget
  3. build

场景 4:横竖屏切换

  1. didUpdateWidget
  2. build
  3. didUpdateWidget
  4. build

三、概念补充:

1、mounted

两个作用:

1、是否分配到 buildContext;

2、判断当前组件是否仍被装在树上。

dispose 被调用后返回 false。

2、InheritedWidget

它提供了一种数据在 widget 树中从上到下传递、共享的方式。

State 对象有一个 didChangeDependencies 回调,它会在“依赖”发生变化时被 Flutter Framework 调用。而这个“依赖”指的就是子widget 是否使用了父 widget 中 InheritedWidget 的数据!如果使用了,则代表子 widget 依赖有依赖 InheritedWidget;如果没有使用则代表没有依赖。这种机制可以使子组件在所依赖的 InheritedWidget 变化时来更新自身!

例:当主题、locale(语言)等发生变化时,依赖其的子 widget 的 didChangeDependencies 方法将会被调用。

四、参考:

  • 数据共享(InheritedWidget)
  • Flutter Lifecycle for Android and iOS Developers
  • flutter State 的生命周期
  • Flutter 知识点: InheritedWidget
  • Flutter 的生命周期

详解 Flutter State 生命周期相关推荐

  1. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  2. Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期

    题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...

  3. 详解Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  4. Java高并发编程详解系列-线程生命周期观察者

    引言   在之前的博客中我们知道,Thread提供了很多可获取的状态,以及判断是否alive的方法,但是这些方法都是线程本身提供的,在Runnable运行的过程中所处的状态是无法直接获取到的到,例如什 ...

  5. 详解Vue八大生命周期钩子函数

    摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) .每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用. 本文分享自华为云社区<一文带你弄懂Vue八大生命周期钩子函数&g ...

  6. Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章

    面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥?  具体的问题是什么?现在的面试都不按套路出牌了吗?  抛出一个这么大的问题,你让我怎么回答? 一脸 ...

  7. Android学习之详解Activity的生命周期

    Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...

  8. flutter中state生命周期与app生命周期与路由监听

    State生命周期 1.第一次展示到屏幕上时会依次调用当前element的构造函数,initState,didChangeDependencies,build 2.如果只是自己发生了更新,则只会回调b ...

  9. 【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)

    文章目录 一.Flutter 页面生命周期 1.StatelessWidget 组件生命周期函数 2.StatefulWidget 组件生命周期函数 二.StatefulWidget 组件生命周期 1 ...

最新文章

  1. 系统架构设计:进程缓存和缓存服务,如何抉择?
  2. 【Java Web开发指南】Mybatis一对多关联映射
  3. 第一课-并行编程的几个概念
  4. javadoc源码获取
  5. 面试题 01.03. URL化
  6. Docker的基础命令
  7. 华为p20有没有计算机,用华为P20不知道这三个功能就亏大了!第一个很少人知道!...
  8. Android报错: Caused by: java.lang.ClassCastException: com.github.mikephil.charting.charts.PieChart can
  9. pycharm 连接SQL
  10. imx6 linux内核定义debug口,IMX6Q 调试串口修改
  11. java生成图表_java实现将数据生成图表至excel导出
  12. Hadoop版本比较
  13. 10款最佳项目管理工具推荐
  14. 北京大学肖臻老师《区块链技术与应用》公开课-ETH
  15. 2021年中国人机界面软件市场趋势报告、技术动态创新及2027年市场预测
  16. vue开发银行流水查询系统--基于巨杉数据库
  17. 在Unity中实现基于粒子的水模拟(三:混合屏幕)
  18. Clonezilla 再生龙
  19. Md5工具包加密之MD5Util
  20. openswan协商流程之(四):main_inI2_outR2()

热门文章

  1. 青海省软考报名时间成绩查询青海省教育考试院青海省人事考试网报名入口
  2. springboot钱包支付系统
  3. 住在两个韩国小姐姐家里是什么体验?
  4. 牛客练习赛 43 CTachibana Kanade Loves Review 线性做法,贪心(Java版成功)
  5. Day14 -A 网络编程入门
  6. SolidWorks修改的标准件在装配体保存后又会还原
  7. 【Java EE】-JVM
  8. 2022-2028年全球洞察即服务市场收入年复合增长率CAGR为 12.4%
  9. dedecms切换模板css,dedecms更换模板教程
  10. 直方图均衡化 提升图像亮度和对比度