Flutter学习总结(四)生命周期
提到生命周期太过熟悉,无论android、iOS还是flutter开发,都离不开围绕着生命周期转。生命周期顾名思义就是一个活动从开始创建到结束所经历的这个过程。
前言
我们知道Flutter是面向组件开发,一切皆Widget,所以常说Flutter的生命周期主要是指Widget的生命周期,常见的Widget主要分为StatelessWidget(无状态) 和 StatefulWidget(有状态) 两种,StatelessWidget只进行一次创建绘制,生命周期很简单不在谈,StatefulWidget的生命周期方法相对多一些。
本文主要总结两部分:
- StatefulWidget生命周期(针对Widget)
- 监听App生命周期(针对应用)
StatefulWidget生命周期
StatefulWidget 的生命周期比较复杂,依次为:
- creatState
- initState
- didChangeDependencies
- build
- didUpdateWidget
- deactivate
- dispose
其他辅助生命周期:
- addPostFrameCallback
- reassemble
creatState
当要创建新的 StatefulWidget 的时候,会立即执行 createState,也就是StatefulWidget需要绑定一个状态,只执行一次
initState
initState 是 StatefulWidget 创建完后调用的第一个方法,而且只执行一次,类似于 Android 的 onCreate,此时view并没有渲染,但是这时 StatefulWidget 已经被加载到渲染树里了。
initState执行时,可以在这个方法里初始化一些数据,或者异步加载一些数据。
didChangeDependencies
顾名思义:“依赖改变时发生”,Widget所属的父类对该Widget布局约束发生了改变就会调用。
- 当 StatefulWidget 第一次创建的时候,didChangeDependencies 方法会在 initState 方法之后立即调用,之后当 StatefulWidget 刷新的时候,就不会调用了。
- StatefulWidget 依赖的 InheritedWidget 发生变化之后,didChangeDependencies 才会调用。
典型的场景是当系统语言Locale或应用主题改变时,Flutter framework会通知widget调用此回调。
build
build,主要是返回需要渲染的widget,状态改变时都会触发build执行:
- 父类的build执行时
- initState之后
- setState之后
addPostFrameCallback
addPostFrameCallback 是 StatefulWidge 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用。
addPostFrameCallback 的使用方法是在 initState 里添加回调:
import 'package:flutter/scheduler.dart';
@override
void initState() {super.initState();SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
reassemble
在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。
didUpdateWidget
在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。
deactivate
当要将 State 对象从渲染树中移除的时候,就会调用 deactivate 生命周期,这标志着 StatefulWidget 将要销毁,但是有时候 State 不会被销毁,而是重新插入到渲染树种。
dispose
当 View 不需要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose 生命周期,这时候就可以在 dispose 里做一些取消监听、动画的操作,和 initState 是相反的。
监听App生命周期
app生命周期主要是一些前台后台动作,可以使用WidgetsBindingObserver来监测,方法如下:
1.在State 的类 mix WidgetsBindingObserver,并重写didChangeAppLifecycleState方法:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {@overridevoid didChangeAppLifecycleState(AppLifecycleState state) {super.didChangeAppLifecycleState(state);if (state == AppLifecycleState.paused) {// went to Background}if (state == AppLifecycleState.resumed) {// came back to Foreground}}
}
2.在 State 的 initState 里添加监听:
@overridevoid initState(){super.initState();WidgetsBinding.instance.addObserver(this);}
3.在 State 的 dispose 里移除监听:
@overridevoid dispose() {// TODO: implement disposesuper.dispose();WidgetsBinding.instance.removeObserver(this);}
AppLifecycleState 有以下几种状态:
- resumed:同Android的onResume
- inactive:同Android的onPause
- paused:同Android的onStop
- suspending:应用挂起
Flutter学习总结(四)生命周期相关推荐
- day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法
系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...
- 教女朋友学习 vue的生命周期钩子函数
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...
- Apple Watch学习之路 生命周期研究
无论是Apple app或者Apple Watch app 掌握整个应用的生命周期尤为重要. 下图是watch app整个生命周期图 watchOS生命周期中在代码中是怎么实现的呢? 当用户在Home ...
- java 内存类_Java学习——类的生命周期和内存
常识是本能,有足够的常识便是天才.--肖伯纳 一.类的生命周期 类的生命周期:1.加载:将二进制流加载进来.class 2.连接: 验证:确保加载进来的数据不会损害虚拟机 准备:为类变量分配内存,附默 ...
- vuejs页面跳转_【Vue 学习】 VueJS 生命周期
一.概述 Vue 的生命周期可以分为 8 个生命周期的执行点,从 new 创建 Vue 对象到对象的销毁,其中 4 个基本的,4 个特殊的,在下图中,红色标注的就是 8 个生命周期的执行点,前四个为基 ...
- IOS学习笔记——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- 敏捷项目管理21天学习计划--敏捷生命周期
前情回顾,上一节我们了解到,敏捷起源的背景.宣言.原则:也对以上做了初步的梳理.今天我们开始揭开敏捷神秘面纱的第二层"生命周期".提到"生命周期"详细大伙一定不 ...
- 【Spring学习】Bean生命周期
我理解的Bean生命周期包括两个方面: Bean何时创建,何时销毁 Bean从创建到销毁的执行流程 一.Bean创建与销毁 Bean的创建时机主要由几个配置项共同来决定,包括: scope属性,决定是 ...
- Gavin小黑屋——Vue 学习笔记 :生命周期特点(先渲染HTML标签再渲染数据)
Vue基础 生命周期特点(先渲染HTML标签再渲染数据) 目录 Vue基础 生命周期特点(先渲染HTML标签再渲染数据) 一.Vue生命周期 Vue 的生命周期总共分为8个阶段:创建前/后,载 ...
- Compose系列 四 生命周期
本系列是我学习compose过程中,对官方文档的翻译和解读,以及实验性的Demo工程.主要参考官方文档和中文手册 全部的正文内容(Demo工程除外)源自Compose官方文档,个人解读以引用的形式插入 ...
最新文章
- BERT Word Embeddings Tutorial
- 【Tools】Visual Studio 2019专业版下载和安装
- centos根分区扩容方法linux公社,Centos5给/根分区扩容
- 【渝粤教育】广东开放大学 刑法 形成性考核 (42)
- 笨办法学C 练习45:一个简单的TCP/IP客户端
- 如何打开别人发布的vue项目---express的使用方法
- 前端 JavaScript 获取字符串中重复次数最多的字符
- 面向对象 “上”
- json读取json文件,上传到后台
- UWB定位系统在冬奥会上满足哪些需求
- 机器学习算法(一) K-Means算法简述以及在MNIST上的聚类实现
- 最重要的经济先行指标—PMI
- 常用路由器术语缩略语表
- js经典代码200句
- 蓝牙发射功率dBm换算,发射总能量公式
- 网络游戏引入人工智能:游戏玩家并非真人
- IPv6 基本原理详解介绍
- 仿知音漫客漫画APP--MVP模式
- python io
- VCS产生vpd波形文件