1 remember + mutableStateOf
核心思想 :Compose 是声明式 UI:UI = f (State)
状态变化 → 触发重组 → UI 自动刷新;
状态必须是可观察的(State/Flow),普通变量修改不会触发重组。
作用:mutableStateOf<T>() 创建可观察状态;remember 在重组时保留状态,组件销毁才丢失。
`by` 委托属性:简化 `.value` 读写
适用:**组件内部临时 UI 状态**(开关、输入框文字、弹窗显隐)
1 基础状态 示例
@Composable
fun Counter() {
// 本地状态,仅当前组件使用
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("计数:$count")
}
}
2 状态提升示例
子组件不要持有可变状态,父组件把状态 + 回调传给子组件:
// 父组件:持有状态
@Composable
fun Parent() {
var count by remember { mutableStateOf(0) }
// 把状态和修改事件传给子组件
Child(count = count, onAdd = { count++ })
}
// 子组件:纯展示,不修改状态,只向上抛事件
@Composable
fun Child(count: Int, onAdd: () -> Unit) {
Button(onClick = onAdd) {
Text("$count")
}
}
2 状态放到 ViewModel(业务状态,页面级) ViewModel + StateFlow
ViewModel 中的状态:配置变更(旋转、黑夜模式切换)不会销毁,适合业务数据、列表、接口返回数据。
搭配 StateFlow / MutableStateFlow
适用:**接口数据、分页列表、业务表单数据**,页面级状态首选。
class PageViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count // 对外只读
fun add() {
_count.value +=1
}
}
@Composable
fun Page(vm: PageViewModel = viewModel()) {
// collectAsState:把Flow转为Compose State,自动订阅+取消
val count by vm.count.collectAsState()
Button(onClick = { vm.add() }) {
Text("count $count")
}
}