我想知道GlobalKey
和GlobalObjectKey
之间的区别,更重要的是,在实际使用中的区别,何时使用哪个以及何时避免?
最佳答案
唯一的区别是他们的==
运算符的行为方式
final first = GlobalKey();
final second = GlobalKey();
print(first == second); // false
final first = GlobalObjectKey(42);
final second = GlobalObjectKey(42);
final third = GlobalObjectKey(21);
print(first == second); // true
print(first == third); // false
这很重要,因为Flutter依靠使用
key
比较小部件的==
来查看它是否应该保留该小部件的状态,或者销毁先前的状态并创建一个新状态。它们的用法略有不同。
GlobalKey通常用于
StatefulWidget
内,或者密钥将存储为全局变量:class Example extends StatefulWidget {
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
// Stores the GlobalKey inside the widget State
final key = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
key: key,
child: ...
);
}
}
这种方法是使用类GlobalKey的最灵活的方法。但这也是最冗长的
GlobalObjectKey简化了该用法。它允许使用
StatelessWidget
内的全局键来获取较少的详细代码,但需要一个唯一的“对象”。典型的用法是:
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
final key = const GlobalObjectKey('my_form_key');
return Form(
key: key,
...
);
}
}
这不太冗长。但是我们需要确保传递给
GlobalObjectKey
的对象对此小部件而言是唯一的,并且不会随时间变化。