数据绑定:带有lambda值的ObservableField不能编译

我试图通过计算将一个参数作为参数的lambda来定义View的可见性。 顺便说一下我正在使用Kotlin

在我的ViewModel我有:

  val customerPropVisibility: ObservableField<(KProperty1) -> Int> = ObservableField( { _ -> // body of the lambda }) 

View的绑定expression式如下所示:

  android:visibility="@{vm.customerPropVisibility.invoke(title)}" 

vmtitle被正确地声明为布局data标签中的variables。

在编译时,我得到两个错误:

1)不兼容的types:对象不能转换为Function1

2)不兼容的types:对象不能被转换为整数

第一种types只有一个错误,第二种types有几个错误。 第二种types的错误数量与布局xml文件中lambda的调用数量相同。

我试图解决这个问题:

显然,types1的错误可以通过重写ObservableFieldget()方法来解决(使方法明确地返回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式。