Flutter中 Widget的key有几种?

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、Key 的结构

Key (抽象类)
├── LocalKey (本地唯一)
│   ├── ValueKey (值键)
│   ├── ObjectKey (对象键)
│   └── UniqueKey (唯一键)
└── GlobalKey (全局唯一)
    ├── GlobalObjectKey (全局对象键)
    └── LabeledGlobalKey (带标签全局键)

二、LocalKey(本地唯一)

1. ValueKey - 基于值的键

// 使用值类型(String, int, double等)
ListView(
  children: [
    Container(key: ValueKey('header')),     // String
    Container(key: ValueKey(1)),           // int
    Container(key: ValueKey(3.14)),        // double
  ],
)

2. ObjectKey - 基于对象的键

// 使用对象引用
class User {
  final String id;
  final String name;
  
  User(this.id, this.name);
}

ListView.builder(
  itemCount: users.length,
  itemBuilder: (context, index) {
    return UserItem(
      key: ObjectKey(users[index]),  // 对象引用
      user: users[index],
    );
  },
)

3. UniqueKey - 每次创建都唯一

// 每次构建都生成新Key
AnimatedSwitcher(
  duration: Duration(seconds: 1),
  child: Text(
    '内容',
    key: UniqueKey(),  // 每次切换都会创建新Key
  ),
)

三、GlobalKey(全局唯一)

1. GlobalKey - 全局键

// 声明
final GlobalKey _myKey = GlobalKey();

// 使用
Widget build(BuildContext context) {
  return Container(
    key: _myKey,
    child: Text('全局键示例'),
  );
}

// 访问State
void accessState() {
  final state = _myKey.currentState as _MyWidgetState;
  state.doSomething();
}

// 访问Context
void accessContext() {
  final context = _myKey.currentContext;
  if (context != null) {
    final size = context.size;
  }
}

2. GlobalObjectKey - 全局对象键

// 基于对象的全局键
final user = User('123', '张三');
final GlobalObjectKey userKey = GlobalObjectKey(user);

// 在多个地方使用同一个对象键
Widget1(key: userKey),
Widget2(key: userKey),  // 共享相同状态

3. LabeledGlobalKey - 带标签全局键(已废弃)

// 不建议使用,已被GlobalKey取代
// GlobalKey(debugLabel: 'myWidget')

四、使用场景

Key类型用途场景示例
ValueKey列表项、表单字段ValueKey('email')ValueKey(1)
ObjectKey对象列表ObjectKey(user)ObjectKey(product)
UniqueKey强制重建AnimatedSwitcher, 动态表单
GlobalKey跨Widget访问表单验证、获取Widget信息
GlobalObjectKey全局对象引用共享状态的对象

五、主要的区别

  1. 作用范围

    • LocalKey: 只在父Widget范围内唯一

    • GlobalKey: 在整个应用范围内唯一

  2. 性能影响

    • LocalKey: 性能好,开销小

    • GlobalKey: 性能开销大,谨慎使用

  3. 使用建议

    • 默认不使用Key(Flutter自动管理)

    • 需要时优先使用LocalKey

    • 除非必要,否则不用GlobalKey

总结:ValueKey用于值,ObjectKey用于对象,UniqueKey用于强制重建,GlobalKey用于全局访问。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值