key 的作用
- Key 是一个附加到元素(widgets, semantics, render objects等)的标识符。
- 它用于控制框架是否应将旧widget与当前树中的其他widget匹配起来。
- 简单来说,Keys的作用主要在于保持状态和在widget树重建时识别哪些widget是相同的。
key 的分类
- LocalKey
- ValueKey
- 当你希望Flutter能够区分同类型的两个或多个widget时,可以使用
ValueKey
- ValueKey 应该使用一个在当前上下文中唯一的值来创建
- 通过传入的 value 来比较两个 key 是否相等
- 代码
| |
| void main() { |
| var valKey1 = const ValueKey(1); |
| var valKey2 = const ValueKey(1); |
| assert(identityHashCode(valKey1) == identityHashCode(valKey2)); |
| } |
| void main() { |
| var value = 1; |
| var objectKey1 = ObjectKey(value); |
| var objectKey2 = ObjectKey(value); |
| |
| |
| print(identityHashCode(objectKey1) == identityHashCode(objectKey2)); |
| print(objectKey1 == objectKey2); |
| } |
- UniqueKey
- 没有任何参数
- 直接返回一个唯一的 UniqueKey instance
- 代码
| void main() { |
| var uniqueKey1 = UniqueKey(); |
| var uniqueKey2 = UniqueKey(); |
| |
| assert(identityHashCode(uniqueKey1) == identityHashCode(uniqueKey2)); |
| } |
- GlobalKey(会有一些性能影响)
- GlobalKey
- 没有参数,直接返回一个 unique 的 globalKey
- GlobalKey 可以有多个,每个 GlobalKey 都是全局唯一的。
- 每个 GlobalKey 应该只赋给一个 Widget。一个 Widget 不应该同时有多个 GlobalKey。
- GlobalKey 的作用是在整个应用程序的上下文中唯一标识一个 Widget,它可以用来访问 Widget 的状态或者是用在动画中的 Widget 之间的转换。
- 使用 GlobalKey 可以跨组件和组件树层级访问 Widget 的状态,控制 Widget 或是访问其他与 Widget 相关的功能。
- GlobalObjectKey
- GlobalObjectKey 比 GlobalKey 更加特定,因为它关联了一个具体的对象,并且这个对象的标识符用于确定 Widget 的唯一性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步