likes
comments
collection
share

Flutter State生命周期

作者站长头像
站长
· 阅读数 0

介绍

前言

State最开始的理解是保存状态,但是Widget本身是不可变的,这意味着Widget是轻量级的,会被频繁的创建与销毁,那么StateFulWidget是如何保存状态的呢。

StatefulElment

StatefulElement(StatefulWidget widget)
      : _state = widget.createState(),
        super(widget) {
    _state._element = this;
    _state._widget = widget;
  }

StatefulElement中定义_state变量并持有,_state又持有elementwidget

_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是指ComponentElementsuper._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()递归遍历childStatelessElement逻辑相同,中间调用_state.didUpdateWidget,所以什么时候didUpdateWidget我们可以得出结论:element复用的时候,如果element没有被复用就不会调用didUpdateWidget

结论

具体有张图可以参考

Flutter State生命周期