介绍
State
生命周期是一个经常会问到的问题,掘金的文章有很多相关的文章,码这篇文章记录一下自己的学习过程。想要了解清楚,最好还是认真的看源码,大佬的文章有时候会难懂,但是只有真正了解细节才能变成自己的东西。
前言
State
最开始的理解是保存状态,但是Widget
本身是不可变的,这意味着Widget
是轻量级的,会被频繁的创建与销毁,那么StateFulWidget
是如何保存状态的呢。
在上一篇文章中我们了解了ELement、ComponentElement、StatelessElement调用的方法以及更新的机制,如果canupdate判断相同的情况下element
复用,结合State
会保持状态,我们判断State与Element
关联,下面来看看源码
StatefulElment
StatefulElement(StatefulWidget widget)
: _state = widget.createState(),
super(widget) {
_state._element = this;
_state._widget = widget;
}
复制代码
StatefulElement
中定义_state
变量并持有,_state
又持有element
和widget
_firstBuild
@override
void _firstBuild() {
assert(_state._debugLifecycleState == _StateLifecycle.created);
try {
final dynamic debugCheckForReturnedFuture = _state.initState() as dynamic;
} finally {
}
_state.didChangeDependencies();
super._firstBuild();
}
复制代码
可以看到_firstBuild
调用了initState和didChangeDependencies
,最后调用super._firstBuild()
,super是指ComponentElement
,super._firstBuild()
最终调用rebuild()
performRebuild
@override
void performRebuild() {
if (_didChangeDependencies) {
_state.didChangeDependencies();
_didChangeDependencies = false;
}
super.performRebuild();
}
复制代码
performRebuild
方法调用super.performRebuild=>build()
,updateChild
,更新child
,中间我们看到_state.didChangeDependencies()
,其实可以推断出来是inherited
共享组件数据变化时,rebuild
调用了_state.didChangeDependencies()
,以后有机会可以记录一下inherit
update
StatefulElement#update
@override
void update(StatefulWidget newWidget) {
super.update(newWidget);
final StatefulWidget oldWidget = _state._widget;
_dirty = true;
_state._widget = widget as StatefulWidget;
try {
final dynamic debugCheckForReturnedFuture = _state.didUpdateWidget(oldWidget) as dynamic;
} finally {
}
rebuild();
}
复制代码
Element#update
@mustCallSuper
void update(covariant Widget newWidget) {
_widget = newWidget;
}
复制代码
rebuild()
递归遍历child
跟StatelessElement
逻辑相同,中间调用_state.didUpdateWidget
,所以什么时候didUpdateWidget
我们可以得出结论:element
复用的时候,如果element
没有被复用就不会调用didUpdateWidget
。
结论
具体有张图可以参考