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
didUpdateWideget1
deactivete1
deactivate1
dispose1

原创不易

链接:https://segmentfault.com/a/1190000015211309

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值