android - 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() 方法。这里的任何人都可以帮助解决混乱并解释魔术发生在哪里。提前致谢。
解决方案
在您的第一个场景中,即使您正在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
}
推荐阅读
- c# - 数据模型依赖于另一个数据模型的属性时的数据绑定
- elasticsearch - elasticsearch中关键字类型为文本时如何使用term查询
- android - 如何动态更改依赖项?
- .net - Grafana PromQL 无法读取未定义的属性“结果”
- flutter - 自定义原材料按钮 - Flutter
- angular - 尝试 npm install 时标签名称“file-saver@2.0.1”无效
- angular - RXJS 和 typescript:有条件地使用服务器和客户端代码执行工作
- c# - 如何在 ASP.NET Core 中为 React SPA 自定义身份控制器?
- java - 获取与文件 java 关联的应用程序
- spring-boot - Spring Boot application.properties 无法从另一个属性文件中获取值