Flutter 的生命周期,略知一二
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 子树的,会在如下场景被调用:
- 在调用 initState() 之后;
- 在调用 didUpdateWidget() 之后;
- 在调用 setState() 之后;
- 在调用 didChangeDependencies() 之后;
- 在 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 的生命周期,略知一二相关推荐
- 【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)
文章目录 一.Flutter 页面生命周期 1.StatelessWidget 组件生命周期函数 2.StatefulWidget 组件生命周期函数 二.StatefulWidget 组件生命周期 1 ...
- 【Flutter】Flutter 应用生命周期 ( 前台状态 resumed | 后台状态 paused | 非活动状态 inactive | 组件分离状态 detached )
文章目录 一.Flutter 应用生命周期 二.监听 Flutter 应用生命周期 三.完整代码示例 四.相关资源 一.Flutter 应用生命周期 应用生命周期 : resumed : 应用进入前台 ...
- 详解 Flutter State 生命周期
一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...
- Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...
- Flutter -- Element生命周期
Widget其实是Element的配置项,Flutter中真正代表屏幕上显示元素的类是Element . Tips:Element本身并不处理laying out, painting, 和hit te ...
- flutter中的生命周期
前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...
- Flutter State 的生命周期
本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期. 从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周 ...
- Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)
目录 生命周期 State改变时组件如何刷新 InheritedWidget InheritedModel InheritedNotifier Notifier 生命周期 flutter的生命周期其实 ...
- flutter 图解_Flutter 54: 图解基本生命周期
小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期: 小菜借助 WidgetsBinding 通过观察和监听 d ...
最新文章
- 国内自动驾驶公司争先入局Robotaxi
- Luogu T9376 区间GCD
- Python 实现批量从不同的Linux服务器下载文件
- Android之AsyncTask两种线程池分析和总结
- 二维数组的遍历之查漏补缺
- html模态窗口调试,在模态窗口中显示HTML标记
- python下俄罗斯方块的游戏设计_[源码和文档分享]基于Python的PyGame的俄罗斯方块游戏设计与实现...
- 使用tar进行磁带备份的命令汇总
- boa与cgic库写cgi简介
- Java中异常处理示例
- 层次化网络设计(三层网络结构)
- c语言看门狗指令pic,PIC单片机之看门狗_看门狗定时器工作原理
- 触发器:建立时间和保持时间
- html文字设置为白色,html如何设置文字颜色白色
- dseo13b打开自动消失_刚安装的WIN764位系统
- 智慧医院解决方案(智慧医疗)
- 中职计算机专业可以考什么大学,中职生可以考哪些大学?
- 重新定义智能空调,TCL发布智能空调新战略及产品阵容
- IT搬砖员如何认识能力圈并如何突破自我
- MySQL系列:java单例模式例子