我正在尝试编写一个自定义委托(delegate),该委托(delegate)将清理Kotlin类中数据绑定(bind)的语法。这样就无需为我可能要观察的每个属性定义自定义getter和setter了。

Kotlin中的标准实现如下所示:

class Foo : BaseObservable() {

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

显然,有了很多属性,此类会变得非常冗长。相反,我想要将其抽象为这样的委托(delegate):
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。

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

有一个快捷方式annotation use-site target可以执行相同的操作。
@get:Bindable var bar: String by Delegates.observable("") { prop, old, new ->
    notifyPropertyChanged(BR.bar)
}

关于Android数据与Kotlin,BaseObservable和自定义委托(delegate)的绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46029570/

10-12 00:31
查看更多