LiveData в шаблоне MVVM с переоценкой kotlin - PullRequest
0 голосов
/ 10 января 2020

Я новичок в 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
}

ViewModel:

 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

  }



 }

Действительные данные посредника никогда не обновляются таким образом, как только данные обновлено.

Но если я изменю этот код на

Репозиторий

  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

}
}

ViewModel

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 () в обоих сценариях ios. Может ли кто-нибудь здесь помочь с путаницей и может объяснить, где происходят маги c. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

ваш код не следует шаблону MVVM, для всех живых данных должен быть наблюдатель, когда вы объявляете в init {} значение, которое еще не готово, потому что оно асинхронно c. если вы измените на:

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

код будет работать, это лучший источник для изучения MVVM и шаблона liveata кодовые метки Google

0 голосов
/ 10 января 2020

В вашем первом сценарии, даже если вы обновляете 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

 }
...