Flutter小知识-Widget树

217 阅读1分钟

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元素,判断是复用还是新建.