flutter中的生命周期
前言
和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数体现在了State上面.理解flutter的生命周期,对我们写出一个合理的控件至关重要.
组件State的生命周期整理如下图:
大致可以看成三个阶段
初始化(插入渲染数)
状态改变(在渲染树中存在)
销毁(从渲染书树中移除)
各个函数
构造函数不属于生命周期,因为这时候State的widget属性为空,如果要在构造函数中访问widget的属性是行不通的.但是构造函必然是第一个调用的.
initState
当插入渲染树的时候调用,这个函数在生命周期中调用一次,这里可以做一些初始化工作,比如初始化State的变量.
didChangeDependecies
这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么那?最经典的应用场景是
new DefaultTabController(length: 3, child: new TabBar(
tabs: [ "主页","订单","我的" ]
.map( (data)=>new Text(data) ).toList(),
TabBar本来需要定义一个TabController,但是在外边套一层DfaultTabController就不需要定义TabContrller了,看下源码:
@override
void 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;
}
实际上就是调用uildContext.inheritFromWidgetOfExactType,也就是说didChangeDependencies中,可以跨组件拿到数据
didUpdateWidget
当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setState实际上这里flutter框架会创建一个新的Widget,绑定本State,并对State做些调用.需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听.
比如还是TabBar:
deactiveate
在dispose之前,会调用这个函数.
dispose
一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境.
还是TabBar:
总结一下
阶段 | 调用次数 |
---|---|
构造函数 | 1 |
initState | 调用次数 |
didChangeDependencies | – |
didUpdateWideget | 1 |
deactivete | 1 |
deactivate | 1 |
dispose | 1 |