2

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

在我的ViewModel我有:

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

的绑定表达式View如下:

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

vm并在布局title的标签中正确声明为变量。data

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

1)不兼容的类型:Object不能转换为Function1

2)不兼容的类型:Object不能转换为Integer

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

我解决问题的尝试:

显然,类型 1 的错误可以通过重写 的get()方法来解决ObservableField(使方法Function1显式返回)。这可行,但很难看,编译器在推断customerPropVisibility. 毫无疑问,这里出了点问题。

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

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

如果你偶然发现了同样的问题,请分享解决它的经验。

编辑:

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

我没有将 的值设置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 布局文件中,绑定表达式如下所示:

android:visibility="@{vm.propVisibilityGetter.call(title)}"

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

4

0 回答 0