Enlace de datos de Android con Kotlin, BaseObservable y un delegado personalizado

Estoy intentando escribir un delegado personalizado que limpiaría la syntax para el data binding en una class Kotlin. Eliminaría la necesidad de definir un getter y setter personalizado para cada propiedad que desee observar.

La implementación estándar en Kotlin parece ser la siguiente:

class Foo : BaseObservable() { var bar: String @Bindable get() = bar set(value) { bar = value notifyPropertyChanged(BR.bar) } } 

Claramente, con muchas properties, esta class puede volverse bastante prolija. Lo que me gustaría en cambio es resumirlo en un delegado como ese:

 class BaseObservableDelegate(val id: Int, private val observable: BaseObservable) { @Bindable operator fun getValue(thisRef: Any, property: KProperty<*>): Any { return thisRef } operator fun setValue(thisRef: Any, property: KProperty<*>, value: Any) { observable.notifyPropertyChanged(id) } } 

Entonces, la class que extiende BaseObservable podría volver a tener declaraciones de variables de una sola línea:

 class Foo : BaseObservable() { var bar by BaseObservableDelegate(BR.bar, this) } 

El problema es que sin la anotación @Bindable en la class Foo, no se genera propertyId en BR para la barra. No tengo conocimiento de ninguna otra anotación o método para generar esa identificación de propiedad.

Cualquier orientación sería apreciada.

Puede anotar el getter o setter pnetworkingeterminado sin proporcionar un cuerpo.

 var bar: String by Delegates.observable("") { prop, old, new -> notifyPropertyChanged(BR.bar) } @Bindable get 

Hay un objective de sitio de uso de anotación de acceso directo que hace lo mismo.

 @get:Bindable var bar: String by Delegates.observable("") { prop, old, new -> notifyPropertyChanged(BR.bar) } 
  • RxJava Valor pnetworkingeterminado para throttleFirst
  • Lista mutable de Obersable <Object> espere hasta que todos terminen y combínelos en una list <Object>
  • Crear una function flowable con generate usando RxJava2