ViewModel 是 Android 架构组件的核心,负责管理 UI 相关数据和业务逻辑。本文将深入讲解 ViewModel 在 Compose 项目中的最佳实践。
一、StateFlow 状态管理
@HiltViewModel
class ArticleViewModel @Inject constructor(...) : ViewModel() {
private val _uiState = MutableStateFlow(ArticleUiState())
val uiState = _uiState.asStateFlow()
fun loadArticles() {
viewModelScope.launch {
_uiState.update { it.copy(isLoading = true) }
// 加载数据...
}
}
}
二、一次性事件
private val _events = Channel<LoginEvent>()
val events = _events.receiveAsFlow()
// 在 Compose 中处理
LaunchedEffect(Unit) {
viewModel.events.collect { event ->
when (event) {
is LoginEvent.NavigateToHome -> onNavigateToHome()
is LoginEvent.ShowError -> snackbar.showSnackbar(event.message)
}
}
}
三、SavedStateHandle
@HiltViewModel
class SearchViewModel @Inject constructor(
savedStateHandle: SavedStateHandle
) : ViewModel() {
// 自动保存到 SavedState
val searchQuery = savedStateHandle.getStateFlow("query", "")
fun updateQuery(query: String) {
savedStateHandle["query"] = query
}
}
四、最佳实践
- ✅ 使用 StateFlow 暴露 UI 状态
- ✅ 使用
update函数更新状态 - ✅ 使用 Channel 发送一次性事件
- ✅ 使用 SavedStateHandle 保存状态
- ✅ 表单验证逻辑放在 ViewModel
- ✅ 使用 Hilt 注入依赖
总结
- StateFlow:响应式状态管理
- UiState:单一状态源
- SavedStateHandle:进程重建恢复
- Channel:一次性事件