1. 前言

生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,例如:APP 正在播放视频,当 APP 被切换到后台,则这个时候最好是暂停视频。

Flutter 的生命周期可以分为两个部分:

  • Widget 的生命周期
  • APP 的生命周期

2. Widget 的生命周期

Flutter 里的 Widget 分为 StatelessWidget 和 StatefulWidget 两种,这两种 Widget 的生命周期是不一样的,具体如下讲解。

2.1 StatelessWidget 的生命周期

StatelessWidget 用于不需要维护状态的场景,它通常在 build() 中通过嵌套其它 Widget 来构建 UI,在构建过程中会递归的构建其嵌套的 Widget。所以 StatelessWidget 的生命周期只有一个相关的方法,就是 build() 。

build() 是用来创建 Widget 的,但因为 build() 在每次界面刷新的时候都会调用,所以不要在 build() 里写业务逻辑,可以把业务逻辑写到 StatelessWidget 的构造函数里。

2.2 StatefulWidget 的生命周期

StatefulWidget 与 StatelessWidget 最大的不同就是一个 StatefulWidget 类会对应一个 State 类。State 表示与其对应的 StatefulWidget 要维护的状态。而 StatefulWidget 的生命周期就和 State 息息相关,或者也可以这样说,StatefulWidget 的生命周期就是 State 的生命周期。

StatefulWidget 的生命周期如下图所示:

下面我们来看看各个回调函数:

  • initState():当 Widget 第一次插入到 Widget 树时会被调用,对于每一个State对象,Flutter Framework 只会调用一次该回调。所以,通常在该回调中做一些一次性的操作,如状态初始化、订阅子树的事件通知等。不能在该回调中调用 BuildContext.dependOnInheritedWidgetOfExactType(该方法用于在 Widget 树上获取离当前 Widget 最近的一个父级 InheritFromWidget),原因是在初始化完成后,Widget树中的InheritFromWidget 也可能会发生变化,所以正确的做法应该在在 build() 或 didChangeDependencies() 中调用它。
  • didChangeDependencies():当 State 对象的依赖发生变化时会被调用,例如:在之前 build() 中包含了一个 InheritedWidget,然后在之后的 build() 中 InheritedWidget 发生了变化,那么此时 InheritedWidget 的子 Widget 的 didChangeDependencies() 回调都会被调用。典型的场景是当系统语言 Locale 或应用主题改变时,Flutter Framework 会通知 Widget 调用此回调。
  • build():此回调主要是用于构建 Widget 子树的,会在如下场景被调用:
  1. 在调用 initState() 之后;
  2. 在调用 didUpdateWidget() 之后;
  3. 在调用 setState() 之后;
  4. 在调用 didChangeDependencies() 之后;
  5. 在 State 对象从树中一个位置移除后(会调用 deactivate )又重新插入到树的其它位置之后。
  • reassemble():此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release 模式下永远不会被调用。
  • didUpdateWidget():在 Widget 重新构建时,Flutter Framework 会调用 Widget.canUpdate 来检测 Widget 树中同一位置的新旧节点,然后决定是否需要更新,如果 Widget.canUpdate 返回 true 则会调用此回调。正如之前所述,Widget.canUpdate 会在新旧 Widget 的 key 和 runtimeType 同时相等时会返回 true,也就是说在新旧 widget 的 key 和 runtimeType 同时相等时,didUpdateWidget() 就会被调用。
  • deactivate():当 State 对象从树中被移除时,会调用此回调。在一些场景下,Flutter Framework 会将 State 对象重新插到树中,如包含此 State 对象的子树在树的一个位置移动到另一个位置时(可以通过 GlobalKey 来实现)。如果移除后没有重新插入到树中则紧接着会调用 dispose() 方法。
  • dispose():当 State 对象从树中被永久移除时调用。通常在此回调中释放资源。

3. APP 的生命周期

在前言举了个例子:APP 正在播放视频,当 APP 被切换到后台,则这个时候最好是暂停视频。想实现这个功能,单单使用 Widget 的生命周期是不行的,还得借助 APP 的生命周期。

我们可以通过在 Widget 绑定 WidgetsBindingObserver 并监听 didChangeAppLifecycleState() 的变化事件来监听生命周期。

可以被观察的生命周期事件有:

  • resumed:APP 对用户可见并且可以响应用户的输入。这个事件对应于 Android 中的 onPostResume()。
  • inactive:APP 处于非活跃状态并且不接收用户输入。这个事件只适用于 iOS,Android 上没有对应的事件。
  • paused:APP 当前对用户不可见,无法响应用户输入,并运行在后台。这个事件对应于 Android 中的 onPause()。
  • detached:应用程序仍寄存在 Flutter 引擎上,但与平台 View 分离。处于此状态的时机:引擎首次加载到附加到一个平台 View 的过程中,或者由于执行 Navigator pop ,view 被销毁。

想要了解这些状态含义的更多细节,请查看 AppLifecycleStatus 文档。

Flutter 的生命周期,略知一二相关推荐

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

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

  2. 【Flutter】Flutter 应用生命周期 ( 前台状态 resumed | 后台状态 paused | 非活动状态 inactive | 组件分离状态 detached )

    文章目录 一.Flutter 应用生命周期 二.监听 Flutter 应用生命周期 三.完整代码示例 四.相关资源 一.Flutter 应用生命周期 应用生命周期 : resumed : 应用进入前台 ...

  3. 详解 Flutter State 生命周期

    一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...

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

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

  5. Flutter -- Element生命周期

    Widget其实是Element的配置项,Flutter中真正代表屏幕上显示元素的类是Element . Tips:Element本身并不处理laying out, painting, 和hit te ...

  6. flutter中的生命周期

    前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...

  7. Flutter State 的生命周期

    本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期. 从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周 ...

  8. Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)

    目录 生命周期 State改变时组件如何刷新 InheritedWidget InheritedModel InheritedNotifier Notifier 生命周期 flutter的生命周期其实 ...

  9. flutter 图解_Flutter 54: 图解基本生命周期

    小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期: 小菜借助 WidgetsBinding 通过观察和监听 d ...

最新文章

  1. 国内自动驾驶公司争先入局Robotaxi
  2. Luogu T9376 区间GCD
  3. Python 实现批量从不同的Linux服务器下载文件
  4. Android之AsyncTask两种线程池分析和总结
  5. 二维数组的遍历之查漏补缺
  6. html模态窗口调试,在模态窗口中显示HTML标记
  7. python下俄罗斯方块的游戏设计_[源码和文档分享]基于Python的PyGame的俄罗斯方块游戏设计与实现...
  8. 使用tar进行磁带备份的命令汇总
  9. boa与cgic库写cgi简介
  10. Java中异常处理示例
  11. 层次化网络设计(三层网络结构)
  12. c语言看门狗指令pic,PIC单片机之看门狗_看门狗定时器工作原理
  13. 触发器:建立时间和保持时间
  14. html文字设置为白色,html如何设置文字颜色白色
  15. dseo13b打开自动消失_刚安装的WIN764位系统
  16. 智慧医院解决方案(智慧医疗)
  17. 中职计算机专业可以考什么大学,中职生可以考哪些大学?
  18. 重新定义智能空调,TCL发布智能空调新战略及产品阵容
  19. IT搬砖员如何认识能力圈并如何突破自我
  20. MySQL系列:java单例模式例子

热门文章

  1. VHDL编写8-3线优先编码器
  2. 精品!一组精美的2014年情人节海报素材
  3. 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介
  4. Mac开机后键盘和触控板失灵
  5. Unity中Rigidbody的属性 方法
  6. 国企java程序员,工作稳定收入低,不想干了
  7. vue2项目中按钮实现防抖、节流功能,包含封装代码以及使用
  8. Apple苹果开发者Certificates, Identifiers Profiles创建
  9. 从零开始玩域名!窥探互联网财富秘密!
  10. java多线程并发及线程池