【问题标题】:android - type mismatch in view model by using MutableLiveDataandroid - 使用 MutableLiveData 在视图模型中类型不匹配
【发布时间】: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)
    }
}

这是错误:

我不明白这个错误,我该如何解决?为什么它告诉我类型不正确?

【问题讨论】:

  • _productsMutableLiveData&lt;ProductModel&gt;。因此_products.valueProductModel 属性。如果您的存储库上的getProducts() 返回ProductModel,那么_products.value=repository.getProducts(catId) 将起作用。然而,这不是getProducts() 返回的结果。
  • @CommonsWare 感谢您的回复,但正如您在我的存储库中看到的那样,它返回 MutableLiveData 的值而不仅仅是 ProductModel
  • 正确。我不知道为什么您的存储库正在做它正在做的事情。就个人而言,我希望存储库有一个 suspend 函数来返回 ProductModel,所有 LiveData 的东西都在视图模型中。
  • @CommonsWare ,如果我理解你的意思,你的意思是我只是从存储库中返回 ProductModel 并将其用作我的视图模型中的 LiveData 吗?
  • This sample project 显示了一个存储库,该存储库公开了一个 suspend API 和一个视图模型,使其可以通过 LiveData 提供给 UI。 Here is another sampleHere is a thirda fourth,均来自 this book

标签: android android-livedata android-viewmodel android-mvvm


【解决方案1】:

你必须取LiveData的值例子:

products.value=repository.getProducts(catId).value

但最好的方法是使用Transformations

private val catId = MutableLiveData<String>()

 val products: LiveData<ProductsModel> = Transformations.switchMap(catId) { catId->
    if (catId == null) {
        AbsentLiveData.create<ProductsModel>()
    } else {
        repository.getProducts(catId)
    }
}

【讨论】:

  • 感谢您的回复,但我没看懂,但它并没有解决我的问题
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多