Compose + ViewModel:状态管理与最佳实践

2024-06-15 · 24 min · 架构

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

四、最佳实践

总结