首页 > 解决方案 > 实时数据和 2-Way 数据绑定:未调用自定义设置器

问题描述

我正在使用 2 路数据绑定从我的 ViewModel 中使用 EditText 中设置的字符串更新 LiveData String 对象:

<android.support.design.widget.TextInputEditText
  android:id="@+id/writeReviewTitle"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="@={viewModel.liveReviewTitle}"
/>

因此,据我了解,每次 EditText 中的文本更改时,ViewModel都会更新其属性。liveReviewTitle我认为这是通过使用 TextWatcher 或图书馆为我处理的某种监听机制而发生的。我还认为,当需要更新文本时,它会setter被调用。似乎并非如此!当文本发生变化时,我需要在我的 ViewModel 中做更多的事情,因此我实现了一个自定义setterfor liveReviewTitle,但它没有被调用(我尝试过调试)。这是它在课堂上的样子ViewModel

var liveReviewTitle: MutableLiveData<String> = MutableLiveData()
        set(value) {
            field = value
            customLogicHere()
        }

尝试调试它setter,但它似乎从未被调用!这里发生了什么?感觉有点混乱。文本正在更新,并保存在 中ViewModel,只是setter没有调用。

标签: androiddata-bindingkotlinandroid-databindingandroid-livedata

解决方案


当然它从来没有被调用过,你没有设置一个新的 MutableLiveData,你在 MutableLiveData 中设置了一个新的 String 值(可能带有setValue)。

但是,如果您直接公开 MediatorLiveData 而不是 MutableLiveData,您应该能够拦截正在设置的值并在设置值后执行自定义逻辑。

编辑:以下应该按预期工作:

val liveReviewTitle: MutableLiveData<String> = MutableLiveData()
private val mediator = MediatorLiveData<String>().apply {
    addSource(liveReviewTitle) { value ->
        setValue(value)
        customLogicHere()
    }
}.also { it.observeForever { /* empty */ } }

推荐阅读