【发布时间】:2019-10-14 14:42:19
【问题描述】:
我在我的应用程序中使用 mvvm 架构,这是我的代码:
class ProductRepository : BaseRepository() {
private val mutableLiveData = MutableLiveData<ProductsModel>()
fun getProducts(catId: String): MutableLiveData<ProductsModel> {
if (internetAvailable) {
scope.launch {
val request = api.getProducts(catId)
withContext(Dispatchers.Main) {
try {
val response = request.await()
mutableLiveData.value = response
} catch (e: HttpException) {
// Log exception //
Log.v("this", e.message);
} catch (e: Throwable) {
// Log error //)
Log.v("this", e.message);
}
}
}
}
return mutableLiveData
}
}
存储库通过 ProductsModel 的值返回一个 MutableLiveData。这是我的 viewModel 类:
class ProductsViewModel :ViewModel(){
val repository=ProductRepository()
private val _products=MutableLiveData<ProductsModel>()
val products:LiveData<ProductsModel>
get()=_products
fun getProducts(catId:String){
_products.value=repository.getProducts(catId)
}
}
我不明白这个错误,我该如何解决?为什么它告诉我类型不正确?
【问题讨论】:
-
_products是MutableLiveData<ProductModel>。因此_products.value是ProductModel属性。如果您的存储库上的getProducts()返回ProductModel,那么_products.value=repository.getProducts(catId)将起作用。然而,这不是getProducts()返回的结果。 -
@CommonsWare 感谢您的回复,但正如您在我的存储库中看到的那样,它返回 MutableLiveData
的值而不仅仅是 ProductModel -
正确。我不知道为什么您的存储库正在做它正在做的事情。就个人而言,我希望存储库有一个
suspend函数来返回ProductModel,所有LiveData的东西都在视图模型中。 -
@CommonsWare ,如果我理解你的意思,你的意思是我只是从存储库中返回 ProductModel 并将其用作我的视图模型中的 LiveData 吗?
-
This sample project 显示了一个存储库,该存储库公开了一个
suspendAPI 和一个视图模型,使其可以通过LiveData提供给 UI。 Here is another sample。 Here is a third 和 a fourth,均来自 this book。
标签: android android-livedata android-viewmodel android-mvvm