Jetpack Compose中remember(todo.id)与无参remember写法有什么区别?
remember 带依赖key与无依赖key的差异 核心逻辑
Compose 中 remember 的作用是在 Composable 重组时缓存计算结果,括号内传入的参数为依赖key:仅当依赖key发生变化时,才会重新执行后续 lambda 中的初始化逻辑,否则始终复用之前缓存的结果。
1. 写法 remember(todo.id) { randomTint() }
- 显式指定
todo.id为依赖key:只要当前TodoRow绑定的待办项id不变,就算列表整体触发重组(比如新增待办、列表排序),randomTint()都不会重新执行,图标透明度会始终保持第一次生成的随机值 - 是官方示例的规范写法:保证同一个待办项不管怎么触发列表重组,对应的行样式始终一致,避免UI无意义突变
2. 写法 remember { randomTint() }
- 未指定任何依赖key,等价于依赖空常量数组:仅当
TodoRow第一次被创建、加入渲染树时会执行一次randomTint()生成随机值 - 存在隐藏问题:如果使用
LazyColumn等懒加载列表容器,列表项滑出屏幕后会被回收复用,复用给新的待办项时,因为没有绑定todo.id作为依赖,不会重新生成透明度,会出现「同一个列表位置不同待办项共用同一个随机透明度」、「同一个待办项滑出再滑回透明度发生变化」的异常表现,你当前测试未出问题,只是没有触碰到懒加载复用、列表大范围重组的边界场景
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

