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

相关推荐
赏金术士1 天前
第七章:状态管理实战与架构总结
android·ui·kotlin·compose
赏金术士2 天前
Compose 教学项目
android·kotlin·compose
赏金术士3 天前
Jetpack Compose 状态提升(State Hoisting)完全指南
android·kotlin·compose
赏金术士4 天前
第五章:数据层—网络请求与Repository
android·kotlin·compose
赏金术士4 天前
第二章:Compose入门—声明式UI编程
android·ui·kotlin·compose
赏金术士4 天前
第一章:项目概述与环境搭建
android·kotlin·compose
赏金术士8 天前
Room + Flow 完整教程(现代 Android 官方方案)
android·kotlin·room·compose
帅次9 天前
测试分层:JVM 单测、ViewModel 测试与 Compose UI Test
android·jvm·ui·kotlin·compose·modifier
Jomurphys11 天前
Compose 适配 - 通过 UiMediaScope 获取设备信息
android·compose
帅次12 天前
深入 MaterialTheme:掌握 ColorScheme 与 Typography 的设计核心
android·kotlin·gradle·android jetpack·compose