2025-12-11 14:27:53,某些文章具有时效性,若有错误或已失效,请在下方留言。当 State 改变时,Compose 会自动重新构建(recompose)相关 UI,这就是 Compose 声明式 UI 的核心。
mutableStateOf
mutableStateOf 是 Jetpack Compose 中最基础的状态容器。它会:
- 存储任意类型的一个值
- 当值改变时,通知
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 自动更新













暂无评论内容