数据绑定:具有lambda值的observeField不';不编译
我试图通过计算以一个参数作为参数的lambda来定义数据绑定:具有lambda值的observeField不';不编译,lambda,kotlin,android-databinding,kotlin-interop,Lambda,Kotlin,Android Databinding,Kotlin Interop,我试图通过计算以一个参数作为参数的lambda来定义视图的可见性我正在使用Kotlin,顺便说一句 在我的视图模型中我有: val customerPropVisibility: ObservableField<(KProperty1<Customer, *>) -> Int> = ObservableField( { _ -> // body of the lambda }) vm和title
视图的可见性我正在使用Kotlin,顺便说一句
在我的视图模型中
我有:
val customerPropVisibility: ObservableField<(KProperty1<Customer, *>) -> Int> = ObservableField(
{ _ ->
// body of the lambda
})
vm
和title
在布局的data
标记中正确声明为变量
在编译时,我遇到两个错误:
1)不兼容类型:无法将对象转换为Function1
2)不兼容类型:无法将对象转换为整数
第一类错误只有一个,第二类错误有几个。第二种类型的错误数与布局xml文件中lambda的调用数相同
我解决问题的尝试:
显然,类型1的错误可以通过覆盖observefield
的get()
方法来解决(使该方法显式返回Function1
)。这是可行的,但很难看,应该由编译器在推断customerPropVisibility
的类型时执行当然,这里出了点问题。
类型2的错误对我来说是个谜,因为函数类型(my lambda)显式返回Int
我认为这与Kotlin/Java互操作性有关
如果你偶然发现了同样的问题,请分享解决它的经验
编辑:
由于此错误尚未解决,我使用稍微不同的方法来实现相同的结果:
我没有将observeField
的值设置为lambda,而是将其设置为函数引用(::getVisibility
),如下所示:
在XML布局文件中,绑定表达式如下所示:
android:visibility="@{vm.propVisibilityGetter.call(title)}"
总体结果:视图模型凌乱,但绑定表达式干净。它应该可以工作,所以我为此提出了一个错误:谢谢你让我不再拔出更多的头发。我在编辑中发布了一个变通方法。
fun getVisibility(prop: KProperty1<*, *>): Int = propVisibilityValues[prop] ?: View.GONE
val propVisibilityGetter = ObservableField(::getVisibility)
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()
}
})
}
android:visibility="@{vm.propVisibilityGetter.call(title)}"