前言

和其他的视图框架比如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中的生命周期相关推荐

  1. flutter中state生命周期与app生命周期与路由监听

    State生命周期 1.第一次展示到屏幕上时会依次调用当前element的构造函数,initState,didChangeDependencies,build 2.如果只是自己发生了更新,则只会回调b ...

  2. Flutter State 的生命周期

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

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

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

  4. [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)

    Servlet中的生命周期方法: @Override public void init(ServletConfig servletConfig) throws ServletException {}1 ...

  5. java session 生命周期_Java中httpsession生命周期

    Java中httpsession生命周期 HttpSession会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束,那么从用户访问到退出浏览器它的生命周期过程如下: 1. 当浏览器A向服务 ...

  6. Unity中场景生命周期的监听: EditorSceneManager

    本文分享Unity中场景生命周期的监听: EditorSceneManager 在Unity开发中, 有时我们需要在场景的某些生命周期时做一些特定的操作, 特别是在Editor模式下的一些工具代码. ...

  7. Fragment在ViewPager中的生命周期

    转载自 hdszlk的博客     原文链接:https://www.2cto.com/kf/201607/530540.html 1.一直以来的疑问 Fragment在ViewPager到底经历了哪 ...

  8. 小程序中的生命周期有哪些?

    一.小程序中生命周期的分类 小程序中的生命周期有以下三种: (1)应用生命周期 小程序的生命周期函数是在app.js中调用,通过App(Object)函数用来注册一个小程序,指定其小程序的生命周期回调 ...

  9. uni-app中的生命周期方法

    uni-app中的生命周期方法 -- 重点面试题 概念:LifeCycle Methods,方法名固定,无需自己调用,到了指定的时刻,会被框架自动调用.  1.应用级生命周期方法(App.vue) - ...

最新文章

  1. 通过分析 JDK 源代码研究 Hash 存储机制
  2. gridview的sort_GridView排序:SortDirection始终升序
  3. 让知识来指引你:序列推荐场景中以知识为导向的强化学习模型
  4. ActiveServices
  5. matlab里查看图像属性,MATLAB绘图属性操作
  6. mysql date类型加一个月jdbc_JDBC操作数据库Date类型数据
  7. 1024程序员节来啦!!.NET技术圈独家优惠劵,折后再折,赶紧来抢啊
  8. Python 多进程 multiprocessing 使用示例
  9. (需求实战_01)_shell脚本 ftp协议下载文件
  10. [Node.js] 模块化 -- 爬虫
  11. 一文详解MySQL中的事件调度器EVENT
  12. TeeChart Pro VCL/FMX教程(三):图表分页
  13. 一篇文章快速搞懂十大排序算法(C++实现源码)
  14. 怎么step into MFC Source code
  15. LINUX下载ant源码并编译
  16. php 生成会员卡号,PHP实现生成唯一会员卡号
  17. HTML5期末大作业:仿天猫购物网站设计——仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  18. 如何将谷歌地图叠加到MapGIS三维地球场景
  19. NIOS_Altera EPCS下载 注意事项20210815
  20. java web 甘特图_基于Web开发的甘特图控件,支持Java、.Net

热门文章

  1. linux 类似winscp_mac如何连接远程linux,类似windows上的putty和winscp
  2. antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
  3. ai中如何插入签名_联络中心如何在机器人和对话式AI迷宫中导航
  4. PLSQ执行同样的sql,使用mybatis进行动态拼装执行的时候非常慢的问题解决
  5. MySQL数据库相关命令
  6. maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
  7. iOS一些实用的技巧
  8. 1小时学会:最简单的iOS直播推流(六)h264、aac、flv介绍
  9. 微信小程序 自定义导航栏,只保留右上角胶囊按钮
  10. vue打包后图片找不到情况