【发布时间】:2020-01-10 06:26:02
【问题描述】:
我是 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() 方法。这里的任何人都可以帮助解决混乱,并可以解释魔术发生在哪里。提前致谢。
【问题讨论】:
-
在您的第一个场景中,您是在观察
getResponse()之前先调用initiateOTP()吗? -
initiateOTP 在按钮单击时被调用,而 getResponse 在 Activity 中创建实例时被观察
-
如果你是 MVVM 新手,想学习 MVVM,那么在这里你可以找到 MVVM 实现的示例应用。 MVVMCleanKotlin [github.com/parthpatibandha/MvvmCleanKotlin] 使用 Flickr 图像 API 的示例 android 应用程序,使用 MVVM + 清洁架构 + DI(Koin 依赖注入)的应用程序
标签: android kotlin mvvm android-livedata mutablelivedata