首页 > 解决方案 > MVVM 模式中的 LiveData 与改造 kotlin

问题描述

我是 MVVVM 和改造的新手,我已经成功实现了 MVVM,并且能够将数据从改造移动到存储库,然后从存储库移动到 ViewModel 和视图。

在这样做时,我遇到了一个巨大的混乱,如下所述。在第一种情况下,我的代码如下所示:

存储库:

 fun iniateOTPprocess() : LiveData<GenericResponse> {


    RetroUtils.getApiManager().listRepos().enqueue(object : RetrofitCallback() {

        override fun onResponse(call: Call<GenericResponse>, response: Response<GenericResponse>) {
            super.onResponse(call, response)

            result.value = response.body()

        }
    }

    )

  return result
}

视图模型:

 class LoginViewModel2(application: Application) : AndroidViewModel(application) {

lateinit var username: MutableLiveData<String>
lateinit var password: MutableLiveData<String>
var repository: LoginRepository = LoginRepository(application)
var data = MediatorLiveData<GenericResponse>()
var result = MutableLiveData<GenericResponse>()

init {
    data.addSource(result , Observer {
        data.postValue(it)
    })
}

fun onLoginBtnCLicked() {
    initiateOTP()
}

private fun initiateOTP() {
  result =  repository.iniateOTPprocess()
}

  fun getResponse() : MediatorLiveData<GenericResponse>{
   return data
  }
 }

一旦数据更新,Mediator 实时数据就永远不会以这种方式更新。

但是如果我将此代码更改为

存储库

  class LoginRepository(var application: Application) {

var callback: RetrofitCallback = RetrofitCallback()
var result = MutableLiveData<GenericResponse>()

fun iniateOTPprocess() {

    RetroUtils.getApiManager().listRepos().enqueue(object : RetrofitCallback() {

        override fun onResponse(call: Call<GenericResponse>, response: Response<GenericResponse>) {
            super.onResponse(call, response)

            result.value = response.body()
        }
    }
    )
}

fun getData(): MutableLiveData<GenericResponse> {
    return result
}
}

视图模型

class LoginViewModel2(application: Application) : AndroidViewModel(application) {

lateinit var username: MutableLiveData<String>
lateinit var password: MutableLiveData<String>
var repository: LoginRepository = LoginRepository(application)
var data = MediatorLiveData<GenericResponse>()
var result = MutableLiveData<GenericResponse>()

init {
    data.addSource(repository.getData(), Observer {
        data.postValue(it)
    })
}

fun onLoginBtnCLicked() {
    initiateOTP()
}

private fun initiateOTP() {
    repository.iniateOTPprocess()
}

 fun getResponse() : MediatorLiveData<GenericResponse>{

   return data
 }
}

这段代码开始神奇地工作。在视图中,我在这两种情况下都观察到 getResponse() 方法。这里的任何人都可以帮助解决混乱并解释魔术发生在哪里。提前致谢。

标签: androidkotlinmvvmandroid-livedatamutablelivedata

解决方案


在您的第一个场景中,即使您正在result通过此函数进行更新:

private fun initiateOTP() {
  result =  repository.iniateOTPprocess()
}

您将无法观察到这个新result实例的变化,因为您已经在观察result实例化时创建的第一个实例ViewModel

var result = MutableLiveData<GenericResponse>() // you are observing this instance
init {
    // this result never gets updated
    data.addSource(result , Observer {
        data.postValue(it)


    })

}

...

 fun getResponse() : MediatorLiveData<GenericResponse>{

    return data

 }

推荐阅读