Flutter widget参数Key

代码注释上的描述:用于控制一个widget如何替换树中的另一个widget。如果两个widget的运行时类型和参数key分别相等(==),则通过Element.update更新节点,否则从树中移除旧节点,并创建新节点添加到树中。一般来说,如果widget没有兄弟节点则不需要设置key。

Key的直接子类为LocalKey和GlobalKey;

GlobalKey要求在应用内唯一。拥有GlobalKey的widget在变动其在树中定位时(移动或移除),会对其对应的子树重新定位父节点,这一系列动作需要在同一帧内完成。在上述过程中,会对此widget的全部子孙节点执行State.deactivate操作。

LocalKey要求在兄弟节点中保证唯一,LocalKey直接子类有三个:ValueKey、ObjectKey、UniqueKey。

  1. ValueKey:支持泛型,一般使用基本数据作为唯一标识时使用;
  2. ObjectKey:以对象作为参数,一般以某一对象作为唯一标识时使用;
  3. UniqueKey:创建唯一标识,仅与本身相等;

ValueKey与ObjectKey都支持使用对象创建,但两者计算hashcode的方式不同:

ValueKey<T>:
@override
int get hashCode => hashValues(runtimeType, value);

ObjectKey:
@override
int get hashCode => hashValues(runtimeType, identityHashCode(value));

2022-02-24

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容