数据绑定:带有lambda值的ObservableField不能编译
我试图通过计算将一个参数作为参数的lambda来定义View
的可见性。 顺便说一下 , 我正在使用Kotlin 。
在我的ViewModel
我有:
val customerPropVisibility: ObservableField<(KProperty1) -> Int> = ObservableField( { _ -> // body of the lambda })
该View
的绑定expression式如下所示:
android:visibility="@{vm.customerPropVisibility.invoke(title)}"
vm
和title
被正确地声明为布局data
标签中的variables。
在编译时,我得到两个错误:
1)不兼容的types:对象不能转换为Function1
2)不兼容的types:对象不能被转换为整数
第一种types只有一个错误,第二种types有几个错误。 第二种types的错误数量与布局xml文件中lambda的调用数量相同。
我试图解决这个问题:
显然,types1的错误可以通过重写ObservableField
的get()
方法来解决(使方法明确地返回Function1
)。 这是有效的,但是很难看,编译器在推断customerPropVisibility
的types时应该这样做。 当然,这里有些不对劲。
types2的错误对我来说是一个谜,导致函数types(my lambda)显式地返回Int。
我认为这与Kotlin / Java的互操作性有关。
如果您遇到同样的问题,请分享解决问题的经验。
编辑:
由于这个bug还没有解决,我使用稍微不同的方法来达到相同的结果:
而不是将ObservableField
的值设置为lambda,我将其设置为函数引用( ::getVisibility
),如下所示:
fun getVisibility(prop: KProperty1): Int = propVisibilityValues[prop] ?: View.GONE val propVisibilityGetter = ObservableField(::getVisibility)
每当propVisibilityValues
变化,我通知propVisibilityGetter
:
private val propVisibilityValues = ObservableArrayMap<KProperty1, Int>().apply { addOnMapChangedCallback(object : ObservableMap.OnMapChangedCallback<ObservableMap<KProperty1, Int>, KProperty1, Int>() { override fun onMapChanged(p0: ObservableMap<KProperty1, Int>?, p1: KProperty1?) { propVisibilityGetter.notifyChange() } }) }
在XML布局文件中,绑定expression式如下所示:
android:visibility="@{vm.propVisibilityGetter.call(title)}"
整体结果:视图模型混乱,但干净的绑定expression式。
- 如何使用Android绑定库和Kotlin从视图绑定onClick事件?
- 无法生成视图绑定器java.lang.IndexOutOfBoundsException
- Android数据绑定与自定义适配器
- Android数据绑定构建失败后,Gradle插件更新迁移到annotationProcessor
- 在android布局中使用kotlin的Unit(或任何其他对象)types
- Kotlin stdlib和Databinding
- Android数据绑定和Kotlin
- 无法将硬编码的字符串值传递给Kotlin中的@BindingAdapter
- 在android中使用数据绑定在android:src中为ImageView设置drawable资源ID