我想知道GlobalKeyGlobalObjectKey之间的区别,更重要的是,在实际使用中的区别,何时使用哪个以及何时避免?

最佳答案

唯一的区别是他们的==运算符的行为方式

  • GlobalKey仅等于自身:

  • final first = GlobalKey();
    final second = GlobalKey();
    print(first == second); // false
    
  • 如果对象相等,则两个GlobalObjectKey相等:

  • 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的对象对此小部件而言是唯一的,并且不会随时间变化。

    09-29 21:20