状态管理 (State)
状态(State)是 Compose 的核心。在 Compose 中,状态决定了 UI 在任何特定时刻的呈现方式。
1. 核心 API
remember 与 mutableStateOf
kotlin
@Composable
fun Counter() {
// remember 确保在重组期间保持状态
// mutableStateOf 确保变化时触发重组
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("点击了 $count 次")
}
}kotlin
// 即使屏幕旋转或进程被杀恢复,状态依然存在
var count by rememberSaveable { mutableStateOf(0) }关于 by 委托
使用 by 关键字需要手动导入:
kotlin
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue2. 状态提升 (State Hoisting)
状态提升是将状态移至组件调用者的模式,目的是使组件变得无状态 (Stateless)。
什么时候进行提升?
- 共享性:多个可组合项需要使用该状态。
- 可复用性:希望该组件在不同地方使用不同的状态。
- 可测试性:可以方便地通过参数注入状态进行测试。
3. ViewModel 集成
对于屏幕级状态,ViewModel 是最佳实践方案。
kotlin
class MyViewModel : ViewModel() {
private val _uiState = MutableStateFlow(MyUiState())
val uiState: StateFlow<MyUiState> = _uiState.asStateFlow()
// ...
}
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
// 推荐方式:生命周期感知型收集
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
// UI 展示逻辑...
}依赖提醒
使用 collectAsStateWithLifecycle 需要添加依赖: implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.0")
4. 常见陷阱
错误做法
不要在 Composable 函数体中直接修改非 Compose 管理的变量。
kotlin
@Composable
fun BadExample() {
var count = 0 // 普通变量
Button(onClick = { count++ }) {
// 这不会触发界面更新!
Text("Count: $count")
}
}