Flutter widget id(唯一标识): key

key 的作用

  • Key 是一个附加到元素(widgets, semantics, render objects等)的标识符。
  • 它用于控制框架是否应将旧widget与当前树中的其他widget匹配起来。
  • 简单来说,Keys的作用主要在于保持状态和在widget树重建时识别哪些widget是相同的。

key 的分类

  1. 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));
}
  • ObjectKey
    • 根据引用是否相同判断是否是同一个 key
    • 代码
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));
}
  1. GlobalKey(会有一些性能影响)
  • GlobalKey
    • 没有参数,直接返回一个 unique 的 globalKey
    • GlobalKey 可以有多个,每个 GlobalKey 都是全局唯一的。
    • 每个 GlobalKey 应该只赋给一个 Widget。一个 Widget 不应该同时有多个 GlobalKey。
    • GlobalKey 的作用是在整个应用程序的上下文中唯一标识一个 Widget,它可以用来访问 Widget 的状态或者是用在动画中的 Widget 之间的转换。
    • 使用 GlobalKey 可以跨组件和组件树层级访问 Widget 的状态,控制 Widget 或是访问其他与 Widget 相关的功能。
  • GlobalObjectKey
    • GlobalObjectKey 比 GlobalKey 更加特定,因为它关联了一个具体的对象,并且这个对象的标识符用于确定 Widget 的唯一性。