flutter声明周期相关 performRebuild

1 performRebuild
  1.1 调用Build ,根据不同的实现调用不同,比如StatelessWidget.build 以及 
      StatelessWidget.build      
      StatelessElement 调用 Widget.build();
      StateFulElement 调用 State.build();
  1.2 设置_dirty 为false

  1.3 执行_child = updateChild(Element? child, Widget? newWidget, Object? newSlot);
     1.3.1 第一次 child 应该为null,newWidget 为新构建的widget。
     1.3.2 如果 newWidget 为null ,并且child 不为null,代表要移除 child。执行deactivateChild(child);
    1.3.3 如果child为null,执行inflateWidget(),已分析。
    1.3.4 如果child 不为null , 并且newWidget 不为null。
       1.3.4.1 hasSameSuperclass 代表 child 与newWidget 是否都是 stateless 或者 stateful。
       1.3.4.2 hasSameSuperclass && child.widget == newWidget 这个代表 widget 没有新建。只更新 child 的 _slot,设置  newChild = child;
       1.3.4.3 hasSameSuperclass && Widget.canUpdate(child.widget, newWidget)
        如果Widget 类型没改变,执行child.update(newWidget);设置newChild = child;
       1.3.4.4 否则执行 deactivateChild(child); 并且用 newWidget 生成新的Element newChild = inflateWidget(newWidget, newSlot);

  1.4 如果更新出错,兜底措施_child = updateChild(null, built, slot);使用built 生成新的Element。

子类不同操作不同:
2 StatefulElement 
  if(_didChangeDependencies) state.didChangeDependencies();
  _didChangeDependencies 默认是false。
3 RenderObjectElement
   执行 widget.updateRenderObject(this, renderObject);
   设置 _dirty = false。

你可能感兴趣的:(flutter声明周期相关 performRebuild)