一、remember 家族概览
text
remember 相关 API
├── remember() // 基础:重组后保持值
├── remember(key) // 带键:key变化时重新计算
├── rememberSaveable() // 配置变更后保持
├── rememberCoroutineScope() // 记住协程作用域
├── rememberUpdatedState() // 记住最新值(用于副作用)
├── remember { mutableStateOf() } // 记住状态(最常用组合)
└── derivedStateOf() // 记住派生状态(相关但独立)
二、特别说明
rememberSaveable
- 什么是配置变更
"任何导致 Activity 重建的场景都是配置变更,都需要 rememberSaveable 来保持用户状态"
配置变更包括但不限于:
| 类型 | 示例 | 是否需要 rememberSaveable |
|---|---|---|
| 屏幕方向 | 旋转手机 | ✅ 是 |
| 语言区域 | 切换中英文 | ✅ 是 |
| 深色模式 | 开启夜间主题 | ✅ 是 |
| 字体大小 | 调整系统字体 | ✅ 是 |
| 屏幕尺寸 | 进入分屏 | ✅ 是 |
| 折叠状态 | 折叠屏展开 | ✅ 是 |
| 键盘连接 | 外接键盘 | ✅ 是 |
| 进程杀死 | 系统回收内存 | ✅ 是 |
- 能存什么?怎么存?
1. 基本类型 - 自动存
kotlin
var count by rememberSaveable { mutableIntStateOf(0) }
var text by rememberSaveable { mutableStateOf("") }
var flag by rememberSaveable { mutableStateOf(false) }
2. 可打包对象 - @Parcelize
kotlin
@Parcelize
data class User(
val name: String,
val age: Int
) : Parcelable
@Composable
fun UserScreen() {
var user by rememberSaveable {
mutableStateOf(User("Alice", 25)) // ✅ 自动保存
}
}
3. 复杂对象 - 自定义 Saver
- 与 remember 的对比
| 特性 | remember | rememberSaveable |
|---|---|---|
| 重组后保持 | ✅ 能 | ✅ 能 |
| 屏幕旋转后 | ❌ 不能 | ✅ 能 |
| 进程杀死后 | ❌ 不能 | ✅ 能(系统自动保存 Bundle) |
| 存储位置 | 内存中的组合树 | Bundle + 内存 |
| 存储容量 | 无限制 | 受 Bundle 大小限制 |
| 性能开销 | 小 | 稍大(需要序列化) |
- 应用场景
"用户填的表单、选的 Tab、展开的项目,都应该用 rememberSaveable"
0 条评论