Enlace de datos: el campo Observable con valor lambda no comstack

Estoy tratando de definir la visibilidad de la View calculando la lambda que toma un parámetro como argumento. Estoy usando Kotlin , por cierto.

En mi ViewModel tengo:

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

La expresión de enlace para la View es la siguiente:

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

vm y title se declaran correctamente como variables en la label de data del layout.

En la compilation, recibo dos errores:

1) types incompatibles: el object no se puede convertir a la function 1

2) types incompatibles: el object no se puede convertir a Entero

Solo hay un error del primer tipo y varios errores del segundo tipo. El número de errores del segundo tipo es el mismo que el número de invocaciones de lambda en el file xml de layout.

Mis bashs de resolver el problema:

Obviamente, el error de tipo 1 puede resolverse anulando el método get() de ObservableField (haciendo que el método devuelva Function1 explícitamente). Esto funciona, pero es feo y debe ser hecho por el comstackdor cuando infiere el tipo para customerPropVisibility . Definitivamente, algo está mal aquí.

El error de tipo 2 es un misterio para mí, porque el tipo de function (mi lambda) devuelve explícitamente Int.

Supongo que tiene algo que ver con la interoperabilidad Kotlin / Java.

Si ha tropezado con el mismo problema, comparta la experiencia de resolverlo.

EDITAR:

Dado que este error aún no se ha resuelto, utilizo un enfoque ligeramente diferente para lograr el mismo resultado:

En lugar de establecer el valor de ObservableField en lambda, lo configuré como reference de function ( ::getVisibility ) de la siguiente manera:

 fun getVisibility(prop: KProperty1<*, *>): Int = propVisibilityValues[prop] ?: View.GONE val propVisibilityGetter = ObservableField(::getVisibility) 

Y cada vez que propVisibilityValues los propVisibilityValues notifique a 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() } }) } 

En el file de layout XML, la expresión de enlace se ve así:

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

Resultado general: desorderado en el Modelo de Vista, pero limpia expresiones de enlace.