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

相关推荐
至乐活着4 天前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
le16161615 天前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le16161616 天前
Android Compose Modifier修饰符
android·compose·modifier
小书房16 天前
Android UI为什么由XML转向Compose
xml·ui·compose·声明式ui
le16161617 天前
Android Compose基础布局——从传统XML的视角切入了解
xml·compose
赏金术士22 天前
企业级 Jetpack Compose 项目(入门版)最佳结构
android·kotlin·compose
Jomurphys23 天前
Compose 调用 - 液态玻璃 Backdrop
android·compose
氦客1 个月前
Android Compose 图层的合成 : BlendMode
android·compose·jetpack·layer·blendmode·graphics·图层的合成
赏金术士1 个月前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
赏金术士1 个月前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose