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。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容