android - 实时数据和 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 中做更多的事情,因此我实现了一个自定义setter
for liveReviewTitle
,但它没有被调用(我尝试过调试)。这是它在课堂上的样子ViewModel
:
var liveReviewTitle: MutableLiveData<String> = MutableLiveData()
set(value) {
field = value
customLogicHere()
}
尝试调试它setter
,但它似乎从未被调用!这里发生了什么?感觉有点混乱。文本正在更新,并保存在 中ViewModel
,只是setter
没有调用。
解决方案
当然它从来没有被调用过,你没有设置一个新的 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 */ } }
推荐阅读
- loops - 伺服电机问题
- c++ - CMake 错误:在安装动脉期间找不到 CryptoPP
- r - R Studio:为具有重复列的大型数据集绘制线
- python - Jupyter笔记本内核未连接
- android - Presenter 中的资源/应用程序上下文(MVP 架构)
- python - 托管实例连接 Python
- javascript - “未捕获的 TypeError:this.setValues 不是函数”使用 Google Maps API v3
- ruamel.yaml - YAML 中序列的特定格式
- python - 如何创建一个打开文件进行写入并让用户写入文件的功能,当用户写入“停止”时,关闭文件?
- c# - 为什么有人会在 C# 中使用“in”参数修饰符?