代码注释上的描述:用于控制一个widget如何替换树中的另一个widget。如果两个widget的运行时类型和参数key分别相等(==),则通过Element.update更新节点,否则从树中移除旧节点,并创建新节点添加到树中。一般来说,如果widget没有兄弟节点则不需要设置key。
Key的直接子类为LocalKey和GlobalKey;
GlobalKey要求在应用内唯一。拥有GlobalKey的widget在变动其在树中定位时(移动或移除),会对其对应的子树重新定位父节点,这一系列动作需要在同一帧内完成。在上述过程中,会对此widget的全部子孙节点执行State.deactivate操作。
LocalKey要求在兄弟节点中保证唯一,LocalKey直接子类有三个:ValueKey、ObjectKey、UniqueKey。
- ValueKey:支持泛型,一般使用基本数据作为唯一标识时使用;
- ObjectKey:以对象作为参数,一般以某一对象作为唯一标识时使用;
- 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
网友评论