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