Flutter State生命周期
介绍
前言
State
最开始的理解是保存状态,但是Widget
本身是不可变的,这意味着Widget
是轻量级的,会被频繁的创建与销毁,那么StateFulWidget
是如何保存状态的呢。
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
。
结论
具体有张图可以参考
转载自:https://juejin.cn/post/6959452662345515015