结论: 唯一的区别是他们的 == 操作符的区别
因为在Flutter中,判断2个GlobalKey是否相等是通过 == 操作符控制的。
@override
bool operator ==(Object other) {
if (other.runtimeType != runtimeType) {
return false;
}
return other is GlobalObjectKey<T>
&& identical(other.value, value);
}
对于GlobalKey来讲:
final first = GlobalKey();
final second = GlobalKey();
print(first == second); // false
任何2个GlobalKey都不可能相等。
对于GlobalObjectKey来讲:
final first = GlobalObjectKey(1);
final second = GlobalObjectKey(1);
final third = GlobalObjectKey(2);
print(first == second); // true
print(first == third); // false
因为Flutter会依赖GlobalKey的== 操作符,所以此时first和second由于他们的value一致,所以他们相等。可以用来判断当前widget是需要保留还是销毁重建。
一般用于:
如果你想使用GlobalKey,那你必须用StatefulWidget
class Example extends StatefulWidget {
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
//作为成员变量存储
final key = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Container(
key: key,
);
}
}
这种方法使用GlobalKey最灵活,但是比较麻烦。
而GlobalObjectKey是对该用法的简化。它可以直接在StatelessWidget中实现。
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
final key = const GlobalObjectKey('container');
return Container(
key: key,
);
}
}
这样的写法很简单。并且由于 GlobalObjectKey 的 value “container” 是一致的,所以 Container 这个 Widget 不会销毁再重新创建。
评论区