【问题标题】:ViewModel with several LiveData and UseCases具有多个 LiveData 和用例的 ViewModel
【发布时间】:2019-03-12 16:37:38
【问题描述】:

我目前正在尝试为 Fragment 制作视图模型。我的方法是对一个片段只使用一个视图模型。我有几个不同场景的用例,例如。取书,获取有关一本书的信息。所有这些用例都发生在一个 Fragment 中。现在我用 3 个相互独立的 UseCases 和 3 个对应的 LiveData 制作了一个 ViewModel。

我想知道这是否是一个好习惯。有什么建议吗?

class GetBooksViewModel
@Inject constructor(private val getBooksUseCase: GetBooksUseCase,
private val getBooksListsUseCase: GetBooksListsUseCase,
private val getInfoByBookUseCase: GetInfoByBookUseCase) :
    BaseViewModel() {

var books: MutableLiveData<java.util.LinkedHashMap<String, Book?>> = MutableLiveData()
var bookLists: MutableLiveData<List<BookList>> = MutableLiveData()
var infos: MutableLiveData<List<BookInfo>> = MutableLiveData()

//methods for fetching data will be below

fun getBooks() =
getChannelsUseCase() {
  it.either(::handleFailure, ::handleGetBooksUseCase)
}

private fun handleGetBooksUseCase(response: 
 java.util.LinkedHashMap<String, Channel?>) {
this.books.value = response
}  

片段内部

getBooksViewModel = viewModel(viewModelFactory) {
  observe(books, ::getBooks)
  observe(booksLists, ::getBooksLists)
  observe(bookInfos, ::doSomethingWithInfos)
  failure(failure, ::handleFailure)
}

【问题讨论】:

  • 我个人认为(这只是一种意见,但是)api fetch 任务的名称“UseCase”是非常不幸的。是的,我知道它来自Android Clean Architecture document from 2014,但另一方面,如果您考虑 UML 用例图,那么获取数据不是用户交互,不是功能,它只是一个实现细节。我更喜欢称它们为“RemoteTask”。一旦你知道它只是一个“任务”而不是用户关心的事情,那么你就可以弄清楚如何处理它,以及它应该何时运行

标签: android kotlin viewmodel android-lifecycle android-livedata


【解决方案1】:

可以使用组合模型代替三个不同的modelsliveData,如下所示:-

class CombinedModel( var map : MutableLiveData<java.util.LinkedHashMap<String, Book?>, var books : MutableList<BookList>, var infos = MutableList<BookInfo> )

实时数据可以是:-

var response: MutableLiveData<CombinedModel>

因此只有一个Observer 逻辑可以处理活动中的所有三个数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2019-07-17
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2014-05-09
    相关资源
    最近更新 更多