我正在尝试通过计算将一个参数作为参数的lambda来定义View
的可见性。 我正在使用Kotlin ,顺便说一句。
在ViewModel
我有:
val customerPropVisibility: ObservableField<(KProperty1<Customer, *>) -> Int> = ObservableField(
{ _ ->
// body of the lambda
})
View
的绑定表达式如下:
android:visibility="@{vm.customerPropVisibility.invoke(title)}"
vm
和title
已在布局的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()
}
})
}
总体结果:视图模型中的杂乱,但是干净的绑定表达式。