compose中 rememberUpdatedState和remember的区别

简单来说,remember 是为了"存储"数据,而 rememberUpdatedState 是为了"追踪"最新的数据(尤其是函数回调)。

以下是两者的技术对比说明:

核心区别

特性 remember rememberUpdatedState
主要用途 在重组中持久化一个变量的值。 在不重启 LaunchedEffect 等长效逻辑的情况下,获取最新的参数值。
更新机制 只有当 key 改变时才会更新内部的值。 只要传入的参数发生变化,它内部的值会自动更新。
返回值 MutableState 或 T。 State(只读,但值总是最新的)。

技术示例:倒计时器

假设我们要写一个倒计时结束后的处理逻辑。

1. 使用 remember 的问题(闭包陷阱)

如果直接在 LaunchedEffect 里使用 remember 捕获的参数,当参数在外部改变时,内部拿到的还是旧值。

@Composablefun TimerComponent(onTimeout: () -> Unit) {

// 假设外部传入的 onTimeout 函数引用发生了变化

LaunchedEffect(Unit) {

delay(5000)

// 5秒后,这里执行的是第一次进入组件时捕获的那个 onTimeout

// 如果外部逻辑变了,这里依然执行的是"旧代码",导致逻辑错误

onTimeout()

}

}

2. 使用 rememberUpdatedState 的正确做法

如果不想因为 onTimeout 变了就让 5 秒倒计时重新开始,但又想在结束时执行最新的 onTimeout:

@Composablefun TimerComponent(onTimeout: () -> Unit) {

// 将传入的参数"包装"起来

// 每次 TimerComponent 重组,updatedOnTimeout.value 都会自动指向最新的 onTimeout

val updatedOnTimeout by rememberUpdatedState(onTimeout)

复制代码
LaunchedEffect(Unit) { // 注意:Key 是 Unit,意味着倒计时逻辑只启动一次,永不重启
    delay(5000)
    // 虽然 LaunchedEffect 没重启,但它通过 value 拿到了外部最新的引用
    updatedOnTimeout() 
}

}

总结说明

  • remember 像是一个保险箱:把东西放进去,只要不换锁(Key 没变),里面的东西就一直不动。
  • rememberUpdatedState 像是一个实时转播显示屏:屏幕(State 对象)本身在那没动,但屏幕显示的内容(Value)永远和现场(外部传入的参数)保持同步。

在 LoadMoreContent 示例中,如果 onLoadMore 变了就重启 LaunchedEffect,会导致滑动监听流(snapshotFlow)频繁断开并重建,性能变差。使用 rememberUpdatedState 就能在不折腾"流"的情况下,保证触发的是最新的加载逻辑。

LoadMoreState 是否也需要根据不同的加载结果(如加载失败)来更新这个回调逻辑?

相关推荐
换元不配限2 天前
Jetpack Compose 副作用
compose·jetpack compose·附带效应·副作用·launchedeffect·sideeffect·composable生命周期
Jomurphys2 天前
Compose 适配 - 自适应布局(窗口大小类 WindowSizeClasses、列表详情、辅助窗格)
android·compose
Jomurphys2 天前
Compose 适配 - 分辨率(密度)
android·compose
换元不配限8 天前
Jetpack Compose 状态管理指南
android·状态管理·compose·状态·单向数据流·jetpack compose·状态容器
Android-Flutter18 天前
android compose shadow 阴影 使用
android·kotlin·compose
Android-Flutter19 天前
android compose 自定义Painter绘制图形 使用
android·kotlin·compose
Android-Flutter19 天前
android compose Brush 渐变和着色器 使用
android·kotlin·compose
至乐活着1 个月前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
le1616162 个月前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le1616162 个月前
Android Compose Modifier修饰符
android·compose·modifier