本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、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 | 全局对象引用 | 共享状态的对象 |
五、主要的区别
-
作用范围:
-
LocalKey: 只在父Widget范围内唯一 -
GlobalKey: 在整个应用范围内唯一
-
-
性能影响:
-
LocalKey: 性能好,开销小 -
GlobalKey: 性能开销大,谨慎使用
-
-
使用建议:
-
默认不使用Key(Flutter自动管理)
-
需要时优先使用
LocalKey -
除非必要,否则不用
GlobalKey
-
总结:ValueKey用于值,ObjectKey用于对象,UniqueKey用于强制重建,GlobalKey用于全局访问。
2223

被折叠的 条评论
为什么被折叠?



