Flutter跟安卓的Activity、iOS的ViewController一样拥有自己的生命周期, Flutter中一切都是Widget,渲染方式有点像H5的DOM树。

先看生命周期图:

Flutter生命周期可以分为3个阶段:

1、实例化组件并添加到树, 即Navigator.push;

2、状态变化,即打开新的widget或者依赖的上级widget发生变化;

3、从树中移除,  即Navigator.pop。

在Flutter中Widget都是不可变的, 但实际上需要根据对应的状态刷新Widget。 从而产生了StatelessWidget和StatefulWdiget,  StatefulWidget是由2个对象Widget和State组成的。

为什么将State和Widget分开呢? 

答案是性能, State管理状态(可以理解为Controller),Widget是UI(即View)。 根据状态变化每次生成Widget(即View)可以节省内存,即不必每次创建状态对象State。

构造函数:

同其它高级语言, 只执行一次;

initState:

插入到渲染树时调用,只执行一次。(类似Android Fragment的onCreateView函数)

didChangeDependencies:

1、在初始化initState后执行; 2、显示/关闭其它widget。 3、可执行多次;

didUpdateWidget:

上级节点rebuild widget时, 即上级组件状态发生变化时会触发子widget执行didUpdateWidget;

deative:

有点像Android的onStop函数, 在打开新的Widget或回到这个widget时会执行; 可执行多次;

dispose:

类似于Android的onDestroy, 在执行Navigator.pop后会调用该办法, 表示组件已销毁;

reassemble:

点击闪电会执行,只用于调试时的hot reload。 release版本不会执行该函数。

常见业务场景:

Widget A打开Widget B: Navigator.push(B)

B构造函数--->B initState--->B didChangeDependencies--->B build--->A deactive--->A didChangeDependencies.

Widget B退出: Navigator.pop

A deactive--->A didChangeDependencies--->A build--->B deactive--->B dispose

可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。

activity生命周期和Flutter对应关系:

Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:

1、 resumed 界面可见, 同安卓的onResume。

2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;

3、paused应用挂起,比如退到后台,失去了焦点且不会收到drawframe回调;同安卓的onStop;

4、suspending, iOS中没用,安卓里就是挂起,不会再执行drawframe回调;

下面是生命周期:

1、初次打开widget时,不执行AppLifecycleState的回调;

2、按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause

3、从后台到前台:AppLifecycleState inactive--->ApplifecycleState resumed

4、back键退出应用: AppLifecycleState inactive--->AppLifecycleState paused

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {AppLifecycleState _lastLifecycleState;void dispose() {super.dispose();WidgetsBinding.instance.removeObserver(this);}@overridevoid initState() {super.initState();WidgetsBinding.instance.addObserver(this);}@overridevoid didChangeAppLifecycleState(AppLifecycleState state) {print(state);}...
}

如果还需要其它事件,则可以用EventChannel实现, 从而补全Flutter的生命周期。

Flutter生命周期相关推荐

  1. Flutter 生命周期管理,类似安卓onResume

    发现Flutter生命周期不大符合自己的业务,想要安卓提供的onCreate  onResume等相似的生命周期 在参考其他现有的生命周期管理插件后发现还存在部分问题,所以在第三方的基础上去实现生命周 ...

  2. flutter 生命周期详解

    flutter 生命周期详解 简介 一.widget 生命周期 二.APP 生命周期 总结 简介 众所周知,程序是有生命周期的,那么flutter 的生命周期是什么呢? flutter 的生命周期大体 ...

  3. Flutter 生命周期

    原文链接:https://blog.csdn.net/u011272795/article/details/82695920 前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适 ...

  4. 详解 Flutter State 生命周期

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

  5. flutter中的生命周期

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

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

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

  7. Flutter State 的生命周期

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

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

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

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

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

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

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

最新文章

  1. MapXtreme 2005 学习心得 在地图上创建点/线并显示标注(五)
  2. 程序员开发进度太慢被告上法庭!公司索赔90万,拿出百度词条当证据
  3. [蓝桥杯][算法提高VIP]数组替换-模拟
  4. 欢迎来到Python循环小课堂
  5. 港股区块链板块持续上行,火币科技涨超50%
  6. 正式版的Linux Kernel 5.1来了,非LTS
  7. python 实现相关系数计算和检验
  8. 微信公众号消息模板——Java
  9. js正则校验 统一社会信用代码
  10. 在线 excel 产品技术调研
  11. 公司邮箱登录入口哪个方便,邮箱移动办公哪个最好用?
  12. python正版软件多少钱_正版数据库软件需要多少钱
  13. 如何构建VoIP来是实现电话诈骗之——Asterisk的设置
  14. 使用Python构建参数化FNN(一)——构建可自定义结构的FNN
  15. OPPO、华为、烽火、海能达、腾讯、阿里、德昌面试经验
  16. 3款大数据bi工具,让企业数据分析更简单
  17. 关于Zoom连不了,明明别人可以连接,却提示会议号不存在
  18. Wave Driver介绍-7(驱动中对音量的控制操作-非硬件音量控制)
  19. Physical implementation —— LEF and DEF
  20. html+css+js 制作 PC 端酷狗音乐网页

热门文章

  1. 天正双击墙体不能编辑_如何提高天正CAD画图速度?不妨试试以下几个技巧
  2. Freesurfer学习笔记——Introduction to Freesurfer Output(输出简介)
  3. 利用树莓派组建支持迅雷离线下载的NAS
  4. 使用Kotlin语言两年后,我有话要说
  5. 如何在Coldfusion中上传文件
  6. 电脑只能上qq不能打开网页
  7. 工程初始化:报错... ...is exceeding the 65535 bytes limit
  8. 对往届软件工程的思考——写在软件工程开课之际 by 姜健
  9. PHP编程学习之路 2
  10. RabbitMQ延迟队列