侧边栏壁纸
博主头像
NewTab

记录生活,分享知识

  • 累计撰写 12 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Flutter中GlobalKey和GlobalObjectKey的区别和用法

NewTab
2023-07-28 / 0 评论 / 0 点赞 / 127 阅读 / 335 字 / 正在检测是否收录...
结论: 唯一的区别是他们的 == 操作符的区别

因为在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 不会销毁再重新创建。

0

评论区