flutter中的生命周期

news/2024/9/17 18:05:54

前言

和其他的视图框架比如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
initState1无效(使用setState和不使用一样)
didChangeDependencies>=1无效
didUpdateWidget>=1无效
deactivate>=1
dispose1

http://lihuaxi.xjx100.cn/news/237978.html

相关文章

分布式系统中的一致性和重复性

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!Tanenbaum将分布式系统定义为“分布式系统是一组独立的计算机,它们看起来像是一个用户的单一、连贯的系统”,在“分布式系统原理和范式…

ess用户名和密码_陈ess洁如何从摄影系学生转变为成功的自由职业者和内容创作者(播客)...

ess用户名和密码This week, for our last podcast episode of 2019, I got to chat with freelancer and content creator Jessica Chan - known as CoderCoder on social media - about how she got into tech and started her educational website and YouTube channel.本周&…

Windows下Python 3.6 安装BeautifulSoup库

“ 介绍Python库BeautifulSoup安装。”01—BeautifulSoup库介绍Beautiful Soup是Python的一个库,支持Python 2和Python 3,最主要的功能是从网页抓取数据,即爬虫,官网介绍如下:Beautiful Soup provides a few simple methods and Pythonic idi…

微信小程序使用阿里巴巴iconfont字体图标

打开阿里巴巴iconfont官网(http://www.iconfont.cn/);把用到的字体图标加到项目里面; 进入到项目里面,选择font class方式来使用,如果没有生成过代码的同学点生成,已经有代码的直接复制代码;iconfont.pngiconfont.png4.浏览器新建页面&…

数独难题_如何玩和赢得数独-使用数学和机器学习解决每个数独难题

数独难题Sudoku (and its predecessors) has been played for over a hundred years. When it first came out people had to actually solve the puzzles using only their minds. Now we have computers! (Ok, so most people still just use their minds...)数独(及其前身)已…

前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看。…

破坏区块链技术的安全漏洞

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】链客,有问必答!区块链仍然是一种新兴的技术,它继续引发关于其真实性的全球争论。由于区块链还处于起步阶段,许多人仍然不理解它的真正含义和发展的基础…

RSA加密算法破解及原理

“ RSA加密算法是一种非对称加密算法,目前被广泛应用。本文介绍RSA算法的基本原理和破解方法。”RSA在互联网上被广泛应用,典型的如各个网站的证书。很多应用数据的加密也是使用RSA。本文介绍RSA算法的原理,并介绍其破解方法和工具。01—RSA算…