key 的作用
- Key 是一个附加到元素(widgets, semantics, render objects等)的标识符。
- 它用于控制框架是否应将旧widget与当前树中的其他widget匹配起来。
- 简单来说,Keys的作用主要在于保持状态和在widget树重建时识别哪些widget是相同的。
key 的分类
- LocalKey
- ValueKey
- 当你希望Flutter能够区分同类型的两个或多个widget时,可以使用
ValueKey
- ValueKey 应该使用一个在当前上下文中唯一的值来创建
- 通过传入的 value 来比较两个 key 是否相等
- 代码
/// 正确执行没有任何错误
void main() {
var valKey1 = const ValueKey(1);
var valKey2 = const ValueKey(1);
assert(identityHashCode(valKey1) == identityHashCode(valKey2));
}
void main() {
var value = 1; // 同一个对象实例
var objectKey1 = ObjectKey(value);
var objectKey2 = ObjectKey(value);
// 由于objectKey1和objectKey2是用同一个对象实例(value)创建的,
print(identityHashCode(objectKey1) == identityHashCode(objectKey2)); /// False, 此时如果想要相同必须使用const关键字
print(objectKey1 == objectKey2); /// True
}
- UniqueKey
- 没有任何参数
- 直接返回一个唯一的 UniqueKey instance
- 代码
void main() {
var uniqueKey1 = UniqueKey();
var uniqueKey2 = UniqueKey();
/// 直接出错
assert(identityHashCode(uniqueKey1) == identityHashCode(uniqueKey2));
}
- GlobalKey(会有一些性能影响)
- GlobalKey
- 没有参数,直接返回一个 unique 的 globalKey
- GlobalKey 可以有多个,每个 GlobalKey 都是全局唯一的。
- 每个 GlobalKey 应该只赋给一个 Widget。一个 Widget 不应该同时有多个 GlobalKey。
- GlobalKey 的作用是在整个应用程序的上下文中唯一标识一个 Widget,它可以用来访问 Widget 的状态或者是用在动画中的 Widget 之间的转换。
- 使用 GlobalKey 可以跨组件和组件树层级访问 Widget 的状态,控制 Widget 或是访问其他与 Widget 相关的功能。
- GlobalObjectKey
- GlobalObjectKey 比 GlobalKey 更加特定,因为它关联了一个具体的对象,并且这个对象的标识符用于确定 Widget 的唯一性。