美文网首页
Flutter中最熟悉的陌生人——key

Flutter中最熟悉的陌生人——key

作者: 悟空不是佛 | 来源:发表于2022-09-29 16:30 被阅读0次

Flutter中的widget分为Stateless Widget和Stateful Widget两大类,实际应用中设置key对Stateless Widget影响不大,主要是在Stateful Widget中会有不同的效果,下面我们一起来看看。

首先,我们应该清楚Flutter中的widget都是不可变的,不管是Stateful Widget还是Stateless Widget,就是一旦创建就不能再修改了,但是state对象是可以被修改的。

当我们在widget tree中插入了一个widget时,Flutter Framework会根据widget配置在element tree中对应的location位置插入一个element对象。如果删除了一个widget,同样会把对应location的element对象从树中节点删除。还有一种最普遍的情况就是widget的location变了,如果没有设置key的话,那element对象和widget之间只会通过类型来查找,所以会导致widget信息更新了,但是state信息没有更新,比如同一级的两个相同Type的statefulWidget交换了位置,结果只有widget的信息“交换”了(这里的交换打引号,是因为不是widget真的交换了,widget是不可变的,其实是重建了widget对象),但是state中的信息确没能交换,这是因为state是被element对象持有,两个widget的Type是相同的,所以只要是在同一级中Type相同的element对象就能和widget关联,就会导致widget和element对象不能正确的关联。

设置了key之后,widget就会通过key去同一级中查找element对象并关联,所以此时element对象也能交换到正确的location,state中的信息就也能成功交换了。当然,如果我们修改了widget的key,此时widget找不到相同key的element对象就会创建新的element对象,同时旧的key的element对象就会从节点中删除;如果我们删除了widget的key,那么之前这个key的element对象也找不到对应的widget来关联,那么这个element对象会从节点中删除,同时也会创建一个没有key的新的element对象。

相关文章

  • Flutter Weekly Issue 46

    教程/Articles 说说 Flutter 中最熟悉的陌生人 —— Key 插件/Librarys dna一个 ...

  • flutter中key的使用

    参考文章:说说Flutter中最熟悉的陌生人 —— Key[https://weilu.blog.csdn.net...

  • Flutter中最熟悉的陌生人——key

    Flutter中的widget分为Stateless Widget和Stateful Widget两大类,实际应用...

  • 说说Flutter中最熟悉的陌生人 —— Key

    Key在Flutter的源码中可以说是无处不在,但是我们日常中确不怎么使用它。有点像是“最熟悉的陌生人”,那么今天...

  • 微信中最熟悉的陌生人

    ​【小确幸】出去浪荡了几天回来,着实有些疲倦,昨晚回家倒头就睡,所以今天的日更才这麽晚发送啦。 参加第2期日更,我...

  • Flutter key

    新创建一个Flutter Application的时候,默认生成的代码里面有这么一段 title很好理解,给App...

  • Flutter ---- Key

    Key Key 本身是一个抽象类 LocalKey:用作diff算法的核心所在,用作Element和Widget进...

  • Flutter Key

    什么是key Key 能够帮助开发者在 Widget tree 中保存状态。 Flutter | 深入浅出Key ...

  • Flutter Key

    LocalKey 应用于拥有相同父 Element 的小部件进行比较的情况 1. UniqueKey A key ...

  • flutter的key

    Key本身是一个抽象类,用作diff的核心算法比较Widget。-ValueKey 以一个数据作为Key-Obje...

网友评论

      本文标题:Flutter中最熟悉的陌生人——key

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