一、说明

我们在开发 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. java匿名类的用法
  2. sql 问号的使用 php_PHP中bindParam和bindValue的区别
  3. Java笔记(基础第二篇)
  4. PendingIntent传值接收时为null
  5. 怎么看台式计算机是几位的,怎么看电脑是32位还是64位?一目了然
  6. 【MCVRP】基于matlab模拟退火算法求解带多种容量的车辆路径规划问题【含Matlab源码 918期】
  7. phpstrom 设置svn提交的代码同步到服务器
  8. 自然语言处理之中英语料库
  9. 100套精品PPT模板免费拿!以后再也不用怕老板叫你制作PPT了
  10. tolua unity 报错_unity tolua异常处理
  11. ProcessOn 在线作图,真香指南
  12. 5个好用的样机素材网站
  13. August 2007
  14. android 载入svg动画,实例讲解使用SVG制作loading加载动画的方法
  15. 海南大学 838信号与系统专业课的感悟
  16. 运筹学研究者关注的Github和CSDN账号
  17. 如何利用 Apache APISX 提升 Nginx 的可观测性
  18. Android8.0 USB系统框架
  19. TYVJ P1172 自然数拆分Lunatic版
  20. 【基础知识】~ LUT、CLB、面积/速度问题

热门文章

  1. HtmlFoundation
  2. 计算方法c语言编程,计算方法C语言编程计算方法C语言编程.doc
  3. ChatGPT使用案例之画思维导图
  4. httpd二之主配置文件详解、测试工具、压力测试ab
  5. hduoj -2570-简单的贪心算法入门
  6. 麒麟v10关闭防火墙linux命令,Vue 银河麒麟Kylin V10 B06-移植指导书
  7. Java 实现红包算法
  8. 干涉、间歇性运动机构、运动副
  9. 哲学家干饭问题 C++
  10. 亚太版本xr_亚态可以使它更容易获得