Skip to content

状态管理 (State)

源:Compose 中的状态

状态(State)是 Compose 的核心。在 Compose 中,状态决定了 UI 在任何特定时刻的呈现方式。

1. 核心 API

remembermutableStateOf

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.setValue

2. 状态提升 (State Hoisting)

状态提升是将状态移至组件调用者的模式,目的是使组件变得无状态 (Stateless)

什么时候进行提升?

  1. 共享性:多个可组合项需要使用该状态。
  2. 可复用性:希望该组件在不同地方使用不同的状态。
  3. 可测试性:可以方便地通过参数注入状态进行测试。

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") 
    }
}