⚡ 状态持久化核心 —— rememberSaveable 在 Activity 重建与进程终止时自动保存/恢复,是 Compose 状态管理的“安”。
Configuration 改变导致 Activity 重建,Compose 树被销毁。普通 remember 丢失状态。
App 在后台被系统杀死,用户返回时重新创建进程。rememberSaveable 通过 Bundle 恢复。
语法与 remember 类似,但值会被序列化到 SavedStateHandle。
// 基础用法:自动保存/恢复
var count by rememberSaveable { mutableStateOf(0) }
// 自定义 Saver (例如保存非 Bundle 支持的类型)
var user by rememberSaveable(saver = UserSaver()) {
mutableStateOf(User("小智", 12))
}
| 特性 | remember | rememberSaveable |
|---|---|---|
| 🎯 生命周期 | Composition 存活期间 | Composition + Activity 重建 / 进程恢复 |
| 📦 序列化 | 不需要 | 需要 (Bundle / Saver) |
| ⚡ 屏幕旋转 | ❌ 丢失 | ✅ 自动恢复 |
| 🧩 自定义类型 | 直接存储 | 需实现 Saver 或 Parcelable/Serializable |
Saver 或实现 Parcelable。当类型不是 Bundle 原生支持时,实现 Saver 或使用 mapSaver / listSaver。
// 示例:保存一个数据类 User
data class User(val name: String, val age: Int)
val UserSaver = Saver<User, String>(
save = { user -> "${user.name}:${user.age}" },
restore = { str ->
val parts = str.split(":")
User(parts[0], parts[1].toInt())
}
)
// 使用
var user by rememberSaveable(saver = UserSaver) {
mutableStateOf(User("小明", 10))
}
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 表单输入 (文本/开关) | rememberSaveable | 屏幕旋转后保留用户输入 |
| 列表选中状态 | rememberSaveable + Saver | 保存选中 index 或 id 列表 |
| 网络请求结果 | ViewModel + StateFlow | 避免 Bundle 过大,且进程重建时重新加载 |
| 动画进度/播放状态 | rememberSaveable | 简单浮点/布尔值直接保存 |
| 大对象 / Bitmap | ViewModel + 磁盘/DataStore | Bundle 不适合,进程重建需持久化 |
🎯 核心要点