数据绑定:具有lambda值的ObservableField无法编译

时间:2017-12-04 17:01:03

标签: lambda kotlin android-databinding kotlin-interop

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

ViewModel我有:

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

View的绑定表达式如下:

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

vmtitle已在布局的data标记中正确声明为变量。

编译时,我收到两个错误:

1)不兼容的类型:对象无法转换为Function1

2)不兼容的类型:对象无法转换为整数

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

我尝试解决问题:

显然,类型1的错误可以通过覆盖get()的{​​{1}}方法(使方法明确返回ObservableField)来解决。这可行,但很难看,编译器在推断Function1的类型时应该完成。 当然,这里出了点问题。

类型2的错误对我来说是个谜,因为函数类型(我的lambda)显式返回Int。

我认为它与Kotlin / Java互操作性有关。

如果您遇到同样的问题,请分享解决问题的经验。

修改

由于此错误尚未解决,我使用稍微不同的方法来实现相同的结果:

我没有将customerPropVisibility的值设置为lambda,而是将其设置为函数引用(ObservableField),如下所示:

::getVisibility

每当fun getVisibility(prop: KProperty1<*, *>): Int = propVisibilityValues[prop] ?: View.GONE val propVisibilityGetter = ObservableField(::getVisibility) 更改时,我都会通知propVisibilityValues

propVisibilityGetter

在XML布局文件中,绑定表达式如下所示:

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()
        }
    })
}

总体结果:视图模型中的杂乱,但是干净的绑定表达式。

0 个答案:

没有答案