SuperAPI AI 工具集

android-viewmodel

通用与其它

查看项目

更新于 10-16 06:50

技能介绍

用途:为 Android 应用提供 ViewModel 与界面状态管理的最佳实践,让 ViewModel 持有界面状态与业务逻辑,在配置变更后存活并对外暴露不可变 API。

主要能力:一是 UI 状态,用 StateFlow 表示持久的界面状态(如 Loading、Success(data)、Error(message)、Empty),声明时使用显式后备字段:val uiState: StateFlow<UiState> field = MutableStateFlow(UiState.Loading),后备字段可变而消费方只看到 StateFlow;更新状态优先用 update {},也可在合适时直接赋值 uiState.value = UiState.Success(data)。二是一次性事件,用 SharedFlow 承载不应在重组或配置变更后重放的事件,如导航、Snackbar、Toast、弹窗、权限请求,声明为 val uiEvent: SharedFlow<UiEvent> field = MutableSharedFlow(replay = 0, extraBufferCapacity = 1),其中 replay = 0 保证重建后不重放,extraBufferCapacity = 1 适合配合 tryEmit() 发送;发送可用挂起的 uiEvent.emit(UiEvent.NavigateBack) 或非挂起的 uiEvent.tryEmit(UiEvent.ShowSnackbar("Saved"))。

使用方式:Compose 中用 val state by viewModel.uiState.collectAsStateWithLifecycle() 收集 StateFlow;SharedFlow 在单个 LaunchedEffect 内收集,且不要用 collectAsState() 收集 SharedFlow。XML/View 体系用 lifecycleScope 配合 repeatOnLifecycle(Lifecycle.State.STARTED) 收集状态与事件。所有 ViewModel 工作使用 viewModelScope 启动,业务逻辑尽量委托给 UseCase 或 Repository。状态设计上推荐用单个不可变状态对象表示整屏,避免暴露多个无关 StateFlow。

限制与版本要求:显式后备字段在 Kotlin 2.3 为实验性(需 -Xexplicit-backing-fields),Kotlin 2.4+ 稳定并推荐;旧版本才需使用传统 _state/state 后备属性。其他注意事项包括不暴露 MutableStateFlow、导航事件不用 StateFlow、持久界面状态不用 SharedFlow、不保留重复的 _state 属性。