Flutter是怎么更新widget的状态的?
Flutter的widget树
widget在Flutter中相当于element
的配置文件,如一个Text
设置文字,textstyle等属性,就是在配置widget.
widget是不可变的.
Flutter的element树
element控制显示的元素.element树根据widget获取配置信息,通过renderObject渲染.
element是可变的.
当statefulWidget的配置发生改变时,flutter会将这个element标记为脏元素dirty
,表示它内部数据已经改变.
在执行setstate
重建新的组件树时,判断对应位置组件的类型runtimeType
和标识key
是否和改变前相同,如果相同就复用元素,不相同就创建新的.通过build
方法重新构建,通过renderObject完成渲染.复用使Flutter的性能得到优化.
BuildContext
Flutter中常见的BuildContext
获取上下文,context其实就是widget的element.通过context我们可以得到element位于树中的位置,在navigator跳转或者showDio的时候找到对应的页面位置.
Theme
Flutter中约定widget的of(Buildcontext context)
方法用于获取最近的父widget,比如
Theme.of(context)就是获取当前element最近的Theme;
Navigator.of(context)获取当前element最近的Navigator;
Flutter的renderObject树
renderObject负责帮助element
渲染内容.
总结
Flutter通过三棵树来显示页面,widget组件相当于配置信息,element元素相当于主要内容,renderObject负责辅助element渲染.
setstate
时widget是不可变的,则被丢弃重新生成,element遍历dirty
元素,判断是复用还是新建.