Flutter 54: 图解基本生命周期
小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期;
小菜借助 WidgetsBinding 通过观察和监听 didChangeAppLifecycleState 来分析生命周期事件,与 Android 原生类似;
基本场景
1. 初始化
initState -> didChangeDependencies -> build
2. 页面数据更新
小菜尝试页面按钮点击或弹框处理,均不会涉及生命周期变化,只是在 build 更新 Widget 资源;但是若进行 热重载 生命周期如下:
reassemble -> didUpdateWidget -> build
3. 横竖屏切换
didUpdateWidget -> build -> didUpdateWidget -> build (执行两次)
4. 切至后台
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
5. 切回前台
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
6. 销毁页面
deactivate -> dispose
进阶场景
7. 打开新的页面
新页面initState -> didChangeDependencies -> build -> 旧页面deactivate -> didChangeDependencies -> build (新页面初始化+旧页面置于后台)
8. 新页面切至后台(旧页面未销毁)
旧/新页面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
9. 新页面切回前台
旧/新页面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
10. 新页面销毁
旧页面deactivate -> build(AppLifecycleState.resumed) -> 新页面deactivate -> dispose
特殊场景
小菜也尝试了一下 Android7.0 分屏情况下的生命周期;
11. 进入分屏窗口
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build (与切至后台相同)
12. 进行分屏
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> didChangeAppLifecycleState(AppLifecycleState.inactive) -> build
13. 获取焦点
didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
14. 屏幕大小调整
与 Android 不同,调整屏幕大小不会进行生命周期变化,前提是当前应用已获取焦点,若未获取焦点,则会在调整屏幕大小为全屏时进行获取焦点的生命周期方法;
小总结
- 生命周期整体分为三个部分:初始化 / 状态改变 / 销毁;
- initState 在整个生命周期中的初始化阶段只会调用一次;
- didChangeDependencies 当 State 对象依赖发生变动时调用;
- didUpdateWidget 当 Widget 状态发生改变时调用;实际上每次更新状态时,Flutter 会创建一个新的 Widget,并在该函数中进行新旧 Widget 对比;一般调用该方法之后会调用 build;
- reassemble 只有在 debug 或 热重载 时调用;
- deactivate 从 Widget Tree 中移除 State 对象时会调用,一般用在 dispose 之前;
- dispose 用于 Widget 被销毁时,通常会在此方法中移除监听或清理数据等,整个生命周期只会执行一次;
- resumed 应用程序可见且获取焦点状态,类似于 Android onResume();
- inactive 应用程序处于非活动状态;
- paused 应用程序处于用户不可见,不响应用户状态,处于后台运行状态,类似于 Android onPause();
生命周期非常重要也非常有趣,值得我们多多尝试和研究,小菜仅尝试了几种常见的情况,如有错误请多多指导!
来源:阿策小和尚

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
svga动画使用总结
导语:项目中有用到动画播放的地方,之前用的swf格式的动画,用的flash播放的,集成难度有些大,现改用svga格式动画播放。SVGA 是一种跨平台的开源动画格式,同时兼容 iOS / Android / Web。SVGA 除了使用简单,性能卓越,同时让动画开发分工明确,各自专注各自的领域,大大减少动画交互的沟通成本,提升开发效率。动画设计师专注动画设计,通过工具输出svga动画文件,提供给开发工程师在集成 svga player 之后直接使用。 使用案例 var player = new SVGA.Player('#fa-gift-wrap'); // 页面指定动画播放区域元素id var parser = new SVGA.Parser('#fa-gift-wrap'); parser.load(url, function(videoItem) { player.loops = 1 // 动画循环次数,默认0(无限循环) player.setVideoItem(videoItem); player.startAnimation(); player.onFinished(functi...
- 下一篇
iOS中基于协议的路由设计
一、背景 前段时间对我们自己的App做了结构上的重构,抛弃了之前简单的MVC开发模式,原因是随着App的业务线越来越多,单个页面的功能越来越复杂,MVC开发模式导致整个Controller-layer的代码越来越多。本文将分享重构中的Router模块。 使用路由模式可以解决我们项目中页面与页面之间的耦合(因为我们App是视图生命周期作为驱动,所以这里说是页面,实际是控制器层),因为一个页面功能太多就会引入过多的类,往往会造成import过多,不好管理。而且iOS中执行界面跳转的时候,很容易产生模块间的耦合。 iOS执行界面跳转的时候,代码如下: [firstViewController.navigationController pushViewController:destinationViewController]; 如果在firstViewController里面直接引入头文件就会导致模块间的耦合。我们这里就需要路由模块去解决类似的问题。我们的设计是每个模块都有自己的路由管理,路由主要职责应该有: 管理模块内部跳转。 声明模块的对外接口 声明模块的依赖 二、模块间的跳转 这种设计是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境