setState流程
- 标脏,将对应element添加到dirtyElement队列中
- 触发vsync
- 下一帧drawFrame
1 | void drawFrame() { |
- buildScope
- rebuild
- performRebuild
- didChangeDependencies
- build
- performRebuild
- rebuild
updateChild
调用setState()之后,它所有的子节点调用updateChild(Element child, Widget newWidget, dynamic newSlot):
- 如果之前的位置child为null
- 如果newWidget为null的话,说明这个位置始终没有子节点,直接返回null即可。
- 如果newWidget不为null,说明这个位置新增加了子节点调用inflateWidget(newWidget, newSlot)生成一个新的Element返回
- 如果之前的child不为null
- 如果newWidget为null的话,说明这个位置需要移除以前的节点,调用deactivateChild(child)移除并且返回nullD、如果newWidget不为null的话,先调用Widget.canUpdate(child.widget, newWidget)对比是否能更新。这个方法会对比两个Widget的runtimeType和key,
- 如果一致则说明子Widget没有改变,只是需要根据newWidget(配置清单)更新下当前节点的数据child.update(newWidget);
- 如果不一致说明这个位置发生变化,则deactivateChild(child)后返回inflateWidget(newWidget, newSlot);
- 如果newWidget为null的话,说明这个位置需要移除以前的节点,调用deactivateChild(child)移除并且返回nullD、如果newWidget不为null的话,先调用Widget.canUpdate(child.widget, newWidget)对比是否能更新。这个方法会对比两个Widget的runtimeType和key,