remember
是 Jetpack Compose 中的一个关键函数,用于在组件的重组(Recomposition)过程中保持状态或缓存计算结果,避免重复计算或丢失数据。以下是它的核心特性和用法:
1. 基本作用
- 状态持久化 :在 Composable 函数重组时,
remember
会保留其存储的值,而不是每次重组都重新初始化。 - 性能优化:避免重复计算耗时操作(如复杂计算、网络请求结果缓存)。
2. 基本语法
kotlin
val value = remember {
// 初始值或计算逻辑(仅在首次组合时执行)
expensiveCalculation()
}
- 当 Composable 函数因状态变化重组时,
value
会保持上一次计算的结果,除非remember
的依赖项变化(见下文)。
3. 与 mutableStateOf
结合(状态管理)
remember
常与 mutableStateOf
搭配使用,创建可观察的状态:
kotlin
val count = remember { mutableStateOf(0) } // 类型推导为 MutableState<Int>
-
当
count.value
变化时,依赖它的 Composable 会自动重组。 -
简化写法(推荐):
kotlinvar count by remember { mutableStateOf(0) } // 通过委托语法访问
4. 依赖项控制(key)
通过传递 key
参数,可以控制何时重置 remember
的值:
kotlin
val result = remember(key1 = dep1, key2 = dep2) {
// 当 dep1 或 dep2 变化时,重新执行此代码块
computeValue(dep1, dep2)
}
- 例如:在列表渲染时,根据
itemId
缓存特定项的计算结果。
5. 常见使用场景
-
状态保持:表单输入、开关状态等。
kotlinvar text by remember { mutableStateOf("") }
-
缓存计算:避免重复计算耗时操作。
kotlinval sortedList = remember(list) { list.sorted() }
-
对象引用保持 :如
Painter
、CoroutineScope
等。
6. 与 rememberSaveable
的区别
-
remember
仅在重组期间保持状态,不处理配置变更(如屏幕旋转)。 -
若需持久化状态到
Bundle
,使用rememberSaveable
:kotlinval count = rememberSaveable { mutableStateOf(0) }
注意事项
- 仅用于 Composable 函数 :
remember
是 Compose 的 API,不能在普通 Kotlin 代码中使用。 - 避免滥用:过度使用可能导致内存泄漏或不必要的复杂性。
示例代码
kotlin
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Clicked $count times")
}
}
- 点击按钮时,
count
变化触发重组,但remember
确保计数不会重置。
通过 remember
,Compose 可以高效管理状态和副作用,是构建响应式 UI 的核心工具之一。