Flutter中State的生命周期

State作为StatefulWidget的逻辑和内部状态的持有者.

一个StatefuleWidget类会对应一个State类,在Widget生命周期内,当Widget被build或者Widget发生改变时,会同步读取State的信息。当Widget状态发生改变时,有必要使用State.setState()及时通知State。

State中有两个常用属性:

  1. widget,它表示与该State实例关联的widget实例,由Flutter framework动态设置。注意,这种关联并非永久的,因为在应用声明周期中,UI树上的某一个节点的widget实例在重新构建时可能会变化,但State实例只会在第一次插入到树中时被创建,当在重新构建时,如果widget被修改了,Flutter framework会动态设置State.widget为新的widget实例。

  2. context,它是BuildContext类的一个实例,表示构建widget的上下文,它是操作widget在树中位置的一个句柄,它包含了一些查找、遍历当前Widget树的一些方法。每一个widget都有一个自己的context对象。

当要插入一个StatefulWidget到UI树中时,framework层会同时调用StatefulWidget.createState()方法创建一个State对象。因为StatefulWidget实例可以被生成多次(比如widget多处出现在UI树中),所以可能有多个State对象和一个StatefulWidget建立联系。同样,如果从UI树中移除StatefulWidget,之后再插入StatefulWidget,framework将会调用StatefulWidget.createState()方法再次创建一个新的State对象。

State对象有如下生命周期:

(一)framework调用StatefuleWidget.createState()方法创建一个State对象
(二)新创建的State对象会与BuildContext(当前Widget在UI树中的的位置的句柄)建立联系。这个联系是永久的:State对象永远不会改变这个BuildContext。然而,这个BuildContext可以和其子树在UI树中移动。
(三)framework调用initState。State的子类可以在initState方法中做一次性的初始化操作,在这里可以使用state对象的内部对象context和其所关联的widget对象。
(四)framework调用didChangeDependencies方法。State的子类可以在该方法中进行某些初始化(包括InheritedWidget)。如果BuildContext.inheritFromWidgetOfExactType已经被调用,如果inherited widget之后改变或者如果widget在UI树中移动,则didChangeDependencies方法将会被再次调用。
(五)此时,State对象初始化完成,framework可能调用多次调用它的build方法来获得子树的用户界面的描述。State对象能通过调用setState方法自发地请求重建其子树,这表明其内部状态已经发生改变,可能影响其子树的用户界面。
(六)在此期间,父widget可能会重建并请求树中此位置更新显示具有相同runtimeType和Widget.key的widget。发生这种情况时,framework将会参考新的widget来更新widget的属性,并以旧的widget作为参数调用didUpdateeWidget方法。State对象将会在didUpdateWidget中做出相应的响应(比如动画)。framework会在didUpdateWidget方法之后调用build方法,这意味着在didUpdateWidget中调用setState是多余的。
(七)在开发期间,如果发生热重载,reassemble方法会被调用。这提供了一个机会去重新初始化一些数据。
(八)如果包含State对象的子树从UI树中移除(比如父widget新建一个拥有不同runtimeType或者Widget.key的widget),framework调用deactivate方法。State的子类可以在deactivate方法中清楚和其他elements的联系。
(九)framework可能会将这个子树插入到UI树的其他部分。此时,framework将会调用build方法来保证State对象有机会适应新的位置。如果framework重新插入此子树,它将在子树被移除的动画帧结束之前执行此操作。因此,State对象可以推迟释放大多数资源,直到framework调用其dispose方法。
(十)如果framework在当前帧动画结束时不准备重新插入这个子树,framework将会调用dispose,表明这个State对象将永远不会被再次build。应该在这个方法中释放一些资源(比如停止正在执行的动画)。
(十一)调用dispose方法后,State对象被认为卸载了,并且其mounted属性会被置false。这时候调用setState是错误的。到这里就是生命周期的终点。

 

build

描述此widget表示的部分用户界面。

framework将会在以下几种情况调用这个方法:

1、initState方法之后
2、didUpdateWidget方法之后
3、setState方法之后
4、该State对象的依赖(如InheritedWidget)改变后
5、deactivate方法后,然后将State对象重新插入树的另一个位置的时候。

didChangeDependencies

当前State对象的“依赖”改变时,会调用这个方法通知当前的State。

举个例子:

如果当前State“依赖”的InheritedWidget改变了,framework将会调用这个方法来通知这个对象。
在这个方法中调用BuildContext.inheritFromWidgetOfExactType是安全的。
子类很少覆写这个方法,因为framework通常会在依赖的InheritedWidget改变后调用build方法,覆写这个方法通常用来做一些耗时的工作,比如网络请求。

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值