如何解决将值设置为 MutableLiveData
设置 MutableLiveData
的值时最推荐的执行自定义逻辑的方法是什么?
我有一个 ViewModel
,其中包含多个属性 isConnecting
和 isConnected
。
我想在更改 isConnecting
时将 false
设置为 isConected
class MyViewModel : ViewModel() {
private var _isConnecting = MutableLiveData<Boolean>()
val isConnecting: LiveData<Boolean>
get () = _isConnecting
private var _isConnected = MutableLiveData<Boolean>()
val isConnected: LiveData<Boolean>
get () = _isConnected
}
一种方法是在 MyViewModel
中创建一个函数并设置两个属性:
fun setConnected(value: Boolean) {
_isConnected.value = value
_isConnecting.value = false
}
这没问题,但绝对不能手动设置 _isConnected
并始终使用函数 setConnected()
。无法保证,因此可能存在错误。
另一种方法是让 MyViewModel
观察它自己的 MutableLiveData
:
class MyViewModel : ViewModel() {
// ...
private val isConnectedObserver = Observer<Boolean> {
_isConnecting.value = false
}
init {
isConnected.observeForever(isConnectedObserver)
}
override fun onCleared() {
super.onCleared()
isConnected.removeObserver(isConnectedObserver)
}
}
这避免了第一种方法的问题,但很糟糕。
但是有更好的方法吗?例如以某种方式使用 setter?
解决方法
使用 MediatorLiveData
观察其他 LiveData
对象并对来自它们的 onChanged 事件做出反应:
class MyViewModel : ViewModel() {
private var _isConnecting = MediatorLiveData<Boolean>().also { liveData ->
liveData.addSource(_isConnected) { connected ->
// isConnected changed,some logic here
if (connected) {
liveData.value = false
}
}
}
val isConnecting: LiveData<Boolean>
get() = _isConnecting
private var _isConnected = MutableLiveData<Boolean>()
val isConnected: LiveData<Boolean>
get() = _isConnected
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。