gpt4 book ai didi

android - 清洁架构 : ViewModel with multiple UseCases on Android

转载 作者:行者123 更新时间:2023-12-02 13:39:04 24 4
gpt4 key购买 nike

这更像是一个架构问题,而不是一个错误修复问题。

假设这个应用程序允许用户将公共(public)汽车和/或公共(public)汽车站标记为收藏。我的问题是,我应该有一个 ViewModel使用两个用例还是应该构建一个封装当前逻辑的用例?

同样对于问题部分,我不完全确定应该将组合数据暴露给 UI 层的方式(参见 favouritesExposedLiveData)

在此先感谢 欢迎任何反馈,这是我的 ViewModel您可以假设每个用例都从数据源传递正确的数据。

open class FavouritesViewModel @Inject internal constructor(
private val getFavouriteStationsUseCase: GetFavouriteStationsUseCase,
private val getFavouriteBusesUseCase: GetFavouriteBusesUseCase,
private val favouriteMapper: FavouriteMapper,
private val busMapper: BusMapper,
private val stationMapper: StationMapper) : ViewModel() {

private val favouriteBusesLiveData: MutableLiveData<Resource<List<BusView>>> = MutableLiveData()
private val favouriteStationsLiveData: MutableLiveData<Resource<List<StationView>>> = MutableLiveData()

private lateinit var favouritesMediatorLiveData: MediatorLiveData<List<FavouriteView>>
private lateinit var favouritesExposedLiveData: LiveData<Resource<List<FavouriteView>>>

init {
fetchFavourites()
}

override fun onCleared() {
getFavouriteStationsUseCase.dispose()
getFavouriteBusesUseCase.dispose()
super.onCleared()
}

fun getFavourites(): LiveData<Resource<List<FavouriteView>>> {
return favouritesExposedLiveData
}

private fun fetchFavourites() {
favouritesMediatorLiveData.addSource(favouriteStationsLiveData, { favouriteStationListResource ->
if (favouriteStationListResource?.status == ResourceState.SUCCESS) {
favouriteStationListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})

favouritesMediatorLiveData.addSource(favouriteBusesLiveData, { favouriteBusesListResource ->
if (favouriteBusesListResource?.status == ResourceState.SUCCESS) {
favouriteBusesListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})

getFavouriteStationsUseCase.execute(FavouriteStationsSubscriber())
getFavouriteBusesUseCase.execute(FavouriteBusesSubscriber())
}

inner class FavouriteStationsSubscriber : DisposableSubscriber<List<Station>>() {
override fun onComplete() {}

override fun onNext(t: List<Station>) {
favouriteStationsLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { stationMapper.mapToView(it) }, null))
}

override fun onError(exception: Throwable) {
favouriteStationsLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}

}

inner class FavouriteBusesSubscriber : DisposableSubscriber<List<Bus>>() {
override fun onComplete() {}

override fun onNext(t: List<Bus>) {
favouriteBusesLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { busMapper.mapToView(it) }, null))
}

override fun onError(exception: Throwable) {
favouriteBusesLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}

}
}

注意:目前 MediatorLiveData ( favouritesMediatorLiveData )未将数据绑定(bind)回 favouritesExposedLiveData因为此时,我不确定这是正确的方法;)。

最佳答案

理想情况下,ViewModel 将只有其 View 的 View 状态。通过使用 MediatorLiveData,您可以将所有状态源聚合为一个表示一段时间内的 View 状态。

您可以拥有的是一个数据类,它代表您在 View 模型上构建的 ViewState,并且是您公开的 LiveData
data class FavouritesViewState(val favoriteStations: List<Station>, val favoritBuses: List<Bus>)
但是,您知道依赖 ViewModel 来构造最终的 ViewState,这有点违反单一责任原则,也使您依赖于 Android 框架。

我将使用具有车站和公共(public)汽车用例的复合 UseCase 来处理它,并返回组合数据,然后您可以轻松地从 ViewModel 公开这些数据。

关于android - 清洁架构 : ViewModel with multiple UseCases on Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com