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 是否也需要根据不同的加载结果(如加载失败)来更新这个回调逻辑?

相关推荐
stevenzqzq9 小时前
compose中 contentPadding和Modifier.padding的区别
compose
stevenzqzq4 天前
Android Navigation 组件页面跳转方法说明
android·compose
zh_xuan7 天前
Android compose 可见性动画未执行问题修复
android·compose
hnlgzb8 天前
请详细解释一下MVVM这个设计模型
android·kotlin·android jetpack·compose
hnlgzb10 天前
目前编写安卓app的话有哪几种设计模式?
android·设计模式·kotlin·android jetpack·compose
zh_xuan13 天前
Android compose Navigation 页面导航
android·compose
stevenzqzq16 天前
Kotlin 进阶指南:中缀函数 (Infix Function)
android·kotlin·compose
zh_xuan21 天前
Android compose 自定义主题
android·compose
zh_xuan21 天前
Android compose 使用viewModel
android·compose