如何基于两个MutableLiveData控制保存按钮启用?MediatorLiveData问题解决
解决LiveData联动判断启用保存按钮的问题
嘿,我明白你遇到的问题了!你之前用MediatorLiveData的写法有个小问题——每次单个LiveData更新时,你直接把结果覆盖成了当前源的判断,而没有同时考虑另一个变量的状态,所以才会出现“只要任一满足就为true”的情况。
下面是正确的实现方式,保证只有当age和weight都大于0时,correctData才会返回true:
ViewModel中的正确实现
首先在你的ViewModel里,我们需要每次任一变量变化时,同时检查两个变量的状态:
class YourViewModel : ViewModel() { val age = MutableLiveData<Int>().apply { value = 0 } val weight = MutableLiveData<Double>().apply { value = 0.0 } private val _correctData = MediatorLiveData<Boolean>().apply { // 初始状态设为false,因为两个变量初始值都是0 value = false // 给age和weight都添加监听,任一变化就触发更新逻辑 addSource(age) { updateSaveButtonState() } addSource(weight) { updateSaveButtonState() } } // 对外暴露不可变的LiveData,避免外部修改 val correctData: LiveData<Boolean> = _correctData // 专门的方法来判断两个变量是否都满足条件 private fun updateSaveButtonState() { // 获取当前值,用?:处理null的情况(防止LiveData还没初始化的情况) val currentAge = age.value ?: 0 val currentWeight = weight.value ?: 0.0 // 只有当两者都大于0时,才将状态设为true _correctData.value = currentAge > 0 && currentWeight > 0 } }
在Activity/Fragment中使用
接下来在你的页面里,只需要观察correctData,根据它的值来控制保存按钮的启用状态:
// 假设你已经初始化了viewModel viewModel.correctData.observe(this) { isSaveEnabled -> saveButton.isEnabled = isSaveEnabled }
为什么这样可行?
每次age或者weight的数值变化时,都会触发updateSaveButtonState方法,这个方法会同时获取两个变量的当前值,然后用&&逻辑判断两者是否都大于0,这样就能精准控制保存按钮的启用状态了。
另外,对外暴露不可变的LiveData(correctData)是符合MVVM规范的,避免外部代码意外修改状态。
内容的提问来源于stack exchange,提问作者Remzo
相关产品推荐
相关产品推荐

