我希望在 ViewModel 中设计 UI 状态类,以便在状态更改时启动 UI 重组。
我读过一些示例项目,例如https://github.com/android/compose-samples https://github.com/android/compose-samples and https://github.com/android/architecture-samples https://github.com/android/architecture-samples
我发现这些示例项目都是用Code A的方式设计UI状态类的,我不明白Code A的好处。
你知道我必须创建许多私有变量,例如private val selectedCategory
and private val categories
在代码A中,写入combine( categories, selectedCategory ) { categories, selectedCategory ->...}
逐个。
如果结构为data class HomeViewState(...)
改变了,我必须到处改变其他代码。
我不知道为什么人们不使用代码 B,我认为它是示例,并且它会适应变化data class HomeViewState(...)
,代码B中这种做法有什么缺点?
Code A
class HomeViewModel(
) : ViewModel() {
private val selectedCategory = MutableStateFlow(HomeCategory.Discover)
private val categories = MutableStateFlow(HomeCategory.values().asList())
private val _state = MutableStateFlow(HomeViewState())
val state: StateFlow<HomeViewState>
get() = _state
init {
viewModelScope.launch {
combine(
categories,
selectedCategory
) { categories, selectedCategory ->
HomeViewState(
homeCategories = categories,
selectedHomeCategory = selectedCategory
)
}.catch { throwable ->
// TODO: emit a UI error here. For now we'll just rethrow
throw throwable
}.collect {
_state.value = it
}
}
}
fun onHomeCategorySelected(category: HomeCategory) {
selectedCategory.value = category
}
}
enum class HomeCategory {
Library, Discover
}
data class HomeViewState(
val selectedHomeCategory: HomeCategory = HomeCategory.Discover,
val homeCategories: List<HomeCategory> = emptyList()
)
Code B
class HomeViewModel(
) : ViewModel() {
private val _state = MutableStateFlow(HomeViewState())
val state: StateFlow<HomeViewState>
get() = _state
init {
viewModelScope.launch {
_state.update { it.copy(
selectedHomeCategory= HomeCategory.Discover,
homeCategories = HomeCategory.values().toList()
) }
}
}
fun onHomeCategorySelected(category: HomeCategory) {
_state.update { it.copy(selectedHomeCategory = category) }
}
}
enum class HomeCategory {
Library, Discover
}
data class HomeViewState(
val selectedHomeCategory: HomeCategory = HomeCategory.Discover,
val homeCategories: List<HomeCategory> = emptyList()
)