Flutter widget参数Key

2022-02-24  本文已影响0人  周_0717

代码注释上的描述:用于控制一个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

上一篇 下一篇

猜你喜欢

热点阅读