flutter中的生命周期
前言
和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面。理解flutter的生命周期,对我们写出一个合理的控件至关重要。组件State的生命周期整理如下图所示:
大致可以看成三个阶段
- 初始化(插入渲染树)
- 状态改变(在渲染树中存在)
- 销毁(从渲染树种移除)
各个函数
构造函数
这个函数不属于生命周期,因为这个时候State的widget属性为空,如果要在构造函数中访问widget的属性是行不通的。但是构造函数必然是要第一个调用的。
initState
/// Called when this object is inserted into the tree.
当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。
didChangeDependencies
/// Called when a dependency of this [State] object changes.
这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么呢?最经典的应用场景是
new DefaultTabController(length: 3, child: new TabBar(tabs: [ "主页","订单","我的" ].map( (data)=>new Text(data) ).toList(),
TabBar本来需要定义一个TabController,但是在外面套一层DefaultTabController就不需要定义TabContrller了,看下源码:
@overridevoid didChangeDependencies() {super.didChangeDependencies();_updateTabController();_initIndicatorPainter();}void _updateTabController() {final TabController newController = widget.controller ?? DefaultTabController.of(context);...
注意到这里DefaultTabController.of(context)
static TabController of(BuildContext context) {final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);return scope?.controller;}
实际上就是调用BuildContext.inheritFromWidgetOfExactType,也就说在didChangeDependencies中,可以跨组件拿到数据。
didUpdateWidget
/// Called whenever the widget configuration changes.
当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setState.
实际上这里flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的Widget。
这个函数一般用于比较新、老Widget,看看哪些属性改变了,并对State做一些调整。
需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听。
比如还是TabBar:
deactivate
/// Called when this object is removed from the tree.
在dispose之前,会调用这个函数。
dispose
/// Called when this object is removed from the tree permanently.
一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境。
还是TabBar:
总结一下
阶段 | 调用次数 | 是否支持setState |
构造函数 | 1 | 否 |
initState | 1 | 无效(使用setState和不使用一样) |
didChangeDependencies | >=1 | 无效 |
didUpdateWidget | >=1 | 无效 |
deactivate | >=1 | 否 |
dispose | 1 | 否 |
flutter中的生命周期相关推荐
- flutter中state生命周期与app生命周期与路由监听
State生命周期 1.第一次展示到屏幕上时会依次调用当前element的构造函数,initState,didChangeDependencies,build 2.如果只是自己发生了更新,则只会回调b ...
- Flutter State 的生命周期
本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期. 从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周 ...
- Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...
- [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)
Servlet中的生命周期方法: @Override public void init(ServletConfig servletConfig) throws ServletException {}1 ...
- java session 生命周期_Java中httpsession生命周期
Java中httpsession生命周期 HttpSession会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束,那么从用户访问到退出浏览器它的生命周期过程如下: 1. 当浏览器A向服务 ...
- Unity中场景生命周期的监听: EditorSceneManager
本文分享Unity中场景生命周期的监听: EditorSceneManager 在Unity开发中, 有时我们需要在场景的某些生命周期时做一些特定的操作, 特别是在Editor模式下的一些工具代码. ...
- Fragment在ViewPager中的生命周期
转载自 hdszlk的博客 原文链接:https://www.2cto.com/kf/201607/530540.html 1.一直以来的疑问 Fragment在ViewPager到底经历了哪 ...
- 小程序中的生命周期有哪些?
一.小程序中生命周期的分类 小程序中的生命周期有以下三种: (1)应用生命周期 小程序的生命周期函数是在app.js中调用,通过App(Object)函数用来注册一个小程序,指定其小程序的生命周期回调 ...
- uni-app中的生命周期方法
uni-app中的生命周期方法 -- 重点面试题 概念:LifeCycle Methods,方法名固定,无需自己调用,到了指定的时刻,会被框架自动调用. 1.应用级生命周期方法(App.vue) - ...
最新文章
- 通过分析 JDK 源代码研究 Hash 存储机制
- gridview的sort_GridView排序:SortDirection始终升序
- 让知识来指引你:序列推荐场景中以知识为导向的强化学习模型
- ActiveServices
- matlab里查看图像属性,MATLAB绘图属性操作
- mysql date类型加一个月jdbc_JDBC操作数据库Date类型数据
- 1024程序员节来啦!!.NET技术圈独家优惠劵,折后再折,赶紧来抢啊
- Python 多进程 multiprocessing 使用示例
- (需求实战_01)_shell脚本 ftp协议下载文件
- [Node.js] 模块化 -- 爬虫
- 一文详解MySQL中的事件调度器EVENT
- TeeChart Pro VCL/FMX教程(三):图表分页
- 一篇文章快速搞懂十大排序算法(C++实现源码)
- 怎么step into MFC Source code
- LINUX下载ant源码并编译
- php 生成会员卡号,PHP实现生成唯一会员卡号
- HTML5期末大作业:仿天猫购物网站设计——仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
- 如何将谷歌地图叠加到MapGIS三维地球场景
- NIOS_Altera EPCS下载 注意事项20210815
- java web 甘特图_基于Web开发的甘特图控件,支持Java、.Net
热门文章
- linux 类似winscp_mac如何连接远程linux,类似windows上的putty和winscp
- antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
- ai中如何插入签名_联络中心如何在机器人和对话式AI迷宫中导航
- PLSQ执行同样的sql,使用mybatis进行动态拼装执行的时候非常慢的问题解决
- MySQL数据库相关命令
- maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
- iOS一些实用的技巧
- 1小时学会:最简单的iOS直播推流(六)h264、aac、flv介绍
- 微信小程序 自定义导航栏,只保留右上角胶囊按钮
- vue打包后图片找不到情况