美文网首页Android学习记录
Flutter widget更新原理

Flutter widget更新原理

作者: 旺仔_100 | 来源:发表于2020-12-06 16:59 被阅读0次
    一、背景

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

    相关文章

      网友评论

        本文标题:Flutter widget更新原理

        本文链接:https://www.haomeiwen.com/subject/euwowktx.html