#每天一个知识点#
Jetpack Compose配合ViewModel托管状态,可解决remember在屏幕旋转、配置变更后状态丢失问题,实现UI与业务解耦,也是CMP跨平台标准实践。ViewModel生命周期独立于Compose页面,配置变更不会销毁实例,依靠viewModelScope安全执行协程。

```kotlin
class CounterVM : ViewModel() {
private val _count = MutableStateFlow(0)
val count = _count.asStateFlow()
fun add() { _count.value += 1 }
}
@Composable
fun CounterScreen(vm: CounterVM = viewModel()) {
val count by vm.count.collectAsStateWithLifecycle()
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(text = "计数:$count", fontSize = 22.sp)
Button(onClick = { vm.add() }) { Text("点我+1") }
}
}
``` 

1. MutableStateFlow:可变状态源,私有封装,禁止外部直接修改;asStateFlow对外只暴露只读流,遵循单向数据流。
2. collectAsStateWithLifecycle:带生命周期感知的订阅,页面后台自动暂停收集,节约资源、防止内存泄漏,优于collectAsState。
3. viewModel():获取ViewModel实例,页面重组复用同一个对象,Activity重建仍保留数据。
4. 业务逻辑全部收拢在VM,Composable只负责订阅状态、渲染UI、转发点击事件,UI层不存业务数据。
对比remember本地状态:remember适合组件内部临时轻量状态;ViewModel适合页面级业务数据、接口请求、需要跨配置保留的状态。
[玫瑰][玫瑰][玫瑰]
展开
评论