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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 参考:大灰狼的小绵羊哥哥[https://blog.csdn.net/sinat_17775997]Flutter...
- 老孟导读:关于生命周期的文章共有2篇,一篇(此篇)是介绍 Flutter 中Stateful 组件的生命周期。第二...