一、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 条评论

发表回复

您的电子邮箱地址不会被公开。