Android数据绑定与Kotlin,BaseObservable和一个自定义委托
我正在尝试编写一个自定义的委托,它将清理Kotlin类中数据绑定的语法。 这将消除需要为每个我想要观察的属性定义一个自定义getter和setter。
Kotlin的标准实现如下所示:
class Foo : BaseObservable() { var bar: String @Bindable get() = bar set(value) { bar = value notifyPropertyChanged(BR.bar) } }
显然,这个类有很多属性可以变得相当冗长。 我想要的是将其抽象成如下代表:
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) } }
然后,扩展BaseObservable的类可以返回到一行变量声明:
class Foo : BaseObservable() { var bar by BaseObservableDelegate(BR.bar, this) }
问题是如果没有Foo类中的@Bindable注释,那么在BR中不会为bar生成propertyId。 我不知道任何其他注释或方法来生成该属性ID。
任何指导将不胜感激。
你可以注释默认的getter或setter而不提供一个body。
var bar: String by Delegates.observable("") { prop, old, new -> notifyPropertyChanged(BR.bar) } @Bindable get
有一个快捷方式注释使用网站的目标 ,做同样的事情。
@get:Bindable var bar: String by Delegates.observable("") { prop, old, new -> notifyPropertyChanged(BR.bar) }