我使用 2 路数据绑定来更新 ViewModel 中的 LiveData String 对象,并使用 EditText 中设置的字符串:
<android.support.design.widget.TextInputEditText
android:id="@+id/writeReviewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.liveReviewTitle}"
/>
所以,根据我的理解,ViewModel
会有它的liveReviewTitle
每次 EditText 中的文本更改时,属性都会更新。我认为这是通过使用 TextWatcher 或图书馆为我处理的某种监听机制来实现的。我还以为当文本需要更新时,它会有它的setter
叫。事实似乎并非如此!当文本更改时,我需要在 ViewModel 中执行更多操作,因此我实现了一个自定义setter
for liveReviewTitle
, 但它是没有被叫到(我尝试过调试)。
这就是它在中的样子ViewModel
class:
var liveReviewTitle: MutableLiveData<String> = MutableLiveData()
set(value) {
field = value
customLogicHere()
}
尝试调试这个setter
但它似乎从未被调用过!这里发生了什么?感觉有点混乱。文本正在更新,并保存在ViewModel
,这只是setter
那不叫。
当然它永远不会被调用,您不是在设置一个新的 MutableLiveData,而是在 MutableLiveData 中设置一个新的 String 值(可能使用setValue
).
但是,如果您直接公开 MediatorLiveData 而不是 MutableLiveData,则应该能够拦截正在设置的值并在设置值后执行自定义逻辑。
EDIT:以下应该按预期工作:
val liveReviewTitle: MutableLiveData<String> = MutableLiveData()
private val mediator = MediatorLiveData<String>().apply {
addSource(liveReviewTitle) { value ->
setValue(value)
customLogicHere()
}
}.also { it.observeForever { /* empty */ } }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)