我试图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)}"
总体结果:视图模型中的混乱,但干净的绑定表达式。