Android学习记录

Flutter widget更新原理

2020-12-06  本文已影响0人  旺仔_100
一、背景

我们在写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。

上一篇下一篇

猜你喜欢

热点阅读