我正在通过阅读官方的docs来学习数据绑定。一切都有希望的是,双向绑定中可能存在无限循环。根据{{3}}上的官方文档:
使用双向数据绑定时,请注意不要引入无限循环。当用户更改属性时,将调用使用@InverseBindingAdapter注释的方法,并将该值分配给backing属性。反过来,这将调用使用@BindingAdapter注释的方法,这将触发另一个使用@InverseBindingAdapter注释的方法的调用,依此类推。
我理解该语句的第一部分,即如果属性发生更改并且将新值分配给backing属性,则将调用用@InverseBindingAdapter
进行注释的方法。
但是我不明白的是,为什么在此过程中调用@InverseBindingAdapter
方法时又将@BindingAdapter
方法称为 以及它如何导致无限循环?
答案 0 :(得分:0)
迟到总比我猜想要晚:)发生无限循环的原因是InverseBindingAdapter
基本上是变化的观察者。因此,当用户进行了某些更改时,InverseBindingAdapter中的onChanged
观察者将被触发并执行一些逻辑。因此,BindingAdapter
也会对字段中的更改做出反应并再次更新值,以便再次触发InverseBindingAdapter
中的更改侦听器,而不是我们陷入循环。
所以这是一些视觉效果
在高级DataBinding上检查我的article on Medium,它实际上通过ViewPager和2路绑定示例描述了这种情况。 (是的,无耻的自拔免责声明)
答案 1 :(得分:0)
可以通过在将新值设置为目标视图之前检查旧值和新值来解决此问题。
示例:
@BindingAdapter("android:text")
fun setText(editText: EditText, value: Int) {
val newVal = if (value == 0) "" else value.toString()
val oldVal = editText.text.toString()
if (oldVal == newVal) {
return
}
editText.setText(newVal)
if (newVal.isNotEmpty()) {
editText.setSelection(newVal.length)
}
}