State

State

温馨提示:本文最后更新于2025-12-11 14:27:53,某些文章具有时效性,若有错误或已失效,请在下方留言

State 改变时,Compose 会自动重新构建(recompose)相关 UI,这就是 Compose 声明式 UI 的核心。

mutableStateOf

mutableStateOf 是 Jetpack Compose 中最基础的状态容器。它会:

  1. 存储任意类型的一个值
  2. 当值改变时,通知 Compose 更新 UI(recomposition)

基本用法

var count by mutableStateOf(0)

Button(onClick = { count++ }) {
    Text("Count = $count")
}

每次 count 改变 → UI 自动刷新。

搭配 remember 使用

如果只写 mutableStateOf,每次重新组合都会重新创建变量,状态不持久。

必须搭配

var text by remember { mutableStateOf("") }

记住状态,使它在 recomposition 期间不丢失。

ViewModel 中使用(推荐)

ViewModel 中不需要 remember,具体的特点

  • 持久化(旋转不丢)
  • 触发 Compose UI 更新
class MyViewModel : ViewModel() {

    var name by mutableStateOf("Tom")
        private set

    fun change() {
        name = "Jerry"
    }
}

Compose 中的使用

@Composable
fun Screen(vm: MyViewModel = viewModel()) {
    Text(vm.name)       // 自动更新 UI
}

remember

1. 使用 remember 存储对象的可组合函数包含内部状态,这会使该可组合函数有状态。具有内部状态的可组合函数往往不易重复使用,也更难测试。
2. 不保存任何状态的可组合函数称为无状态可组合函数。创建无状态可组合状态函数的一种简单方式使用状态提升。

remember 让状态在 recomposition 中保持不变。如果不使用remember ,每次 UI 重绘都会重新赋值,导致状态丢失。

var text by remember { mutableStateOf("") }

remember 在旋转 / 进程杀死后,状态会丢失。

rememberSaveable

rememberSaveable 在旋转 / 进程杀死后也保持。适用于

  • 输入框内容
  • Tab 选择状态
  • 页面 UI 配置
  • 屏幕旋转
var username by rememberSaveable { mutableStateOf("") }

会自动保存到 Bundle,例如 Activity 旋转后仍保留。

State Hoisting

在可组合函数中,被多个函数读取或修改的状态应位于共同祖先实体中,此过程称为状态提升

不要把复杂状态放在可组合函数内部。应该把状态从 Composable 提取出来,通过参数传进去。

// ❌ 错误(状态被固定在内部,不可复用)
@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) { Text("$count") }
}

Jetpack Compose 中的常规状态提升模式是将状态变量替换为两个参数:

  • value: T:要显示的当前值
  • onValueChange: (T) -> Unit:请求更改值的事件,包含一个新值 T
// ✔️ 正确(提升状态)
@Composable
fun Counter(count: Int, onCountChange: (Int) -> Unit) {
    Button(onClick = { onCountChange(count + 1) }) {
        Text("$count")
    }
}

ViewModel 管理状态

ViewModel 可在配置变化(旋转等)中保留状态,并与 Compose 完美搭配。

class MyViewModel : ViewModel() {
    var count by mutableStateOf(0)
        private set

    fun increase() { count++ }
}
@Composable
fun Screen(vm: MyViewModel = viewModel()) {
    Text("Count = ${vm.count}")
    Button(onClick = vm::increase) { Text("Add") }
}

derivedStateOf

计算型状态,优化性能。当你需要从其他状态计算新值时使用:

val items = remember { mutableStateListOf(1,2,3) }

val total by derivedStateOf { items.sum() }

Text("Total = $total")

只有 items 改变时才会重新计算。

snapshotFlow

Compose 状态转为 Flow(用于协程)

snapshotFlow { count }
    .collect { value -> println(value) }

mutableStateListOf() / mutableStateMapOf()

可观察集合。状态列表/字典,用于动态 UI:

val list = remember { mutableStateListOf("A", "B") }

list.add("C") // UI 自动更新
© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容