Flutter widget更新原理

一、背景

我们在写StatefulWidget的时候有时候会遇到数据改变了,也刷新(setState)了,但是数据没有任何变化。
解决方法:把StatefulWidget传递一个key即可。
原因:StatefulWidget对应的State更新了,但是flutter未检测到。

二、核心原理分析

1.这个是个复杂的更新问题。这需要从flutter绘制widget的原理开始说起。我们写的widget会生成一个widget树,flutter会根据这个树来生成对应的Element树。然后Element树会生成renderObject,由renderObject来绘制对应的控件到设备上面。

2.为什么会有Widget树、Element树、RenderObject树?直接配置Widget树,然后根据它创建RenderObject树,然后绘制到屏幕不就好了么?这是因为并不是widget一改变就需要重新绘制RenderObject,需要Element在中间去判断是否需要重新绘制,也行只需要修改几个属性而已。这样会大大提高更新的性能。所以Element存在的意义就是如何更好的使用缓存的控件。

2.flutter刷新的widget的判断是两个条件:一是判断当前位置widget和之前在当前位置的widget是不是同一种类型(即之前是Text,现在也是Text,则认为是相同),二是判断当前widget和之前的widget的key是不是相同。同时满足两个条件则认为不需要刷新,即缓存的State的数据不需要更改。如果不给widget传递key则认为是相同的。所以当Widget是相同类型的时候,State里面的数据不会更新。

三、关于Key

1.flutter中的key分两类:一类是LocalKey,一类是GlobalKey。
2.LocalKey包含:ValueKey,ObjectKey,UniqueKey。GlobalKey包含:GlobalKey和GlobalObjectKey。LocalKey一般在同一层级的更新中使用。GlobalKey则是全局跟新有效。
3.LocalKey之间的区别:判断两个ValueKey是否相等是判断这个Widget的equals方法返回值。
判断两个ObjectKey是否相等是判断两个Widget的地址是不是相等。(和java中的equals与==判断很相似)。UniqueKey就是每次创建一个唯一的key。

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

推荐阅读更多精彩内容