与 Kotlin、BaseObservable 和自定义委托(delegate)的 Android 数据绑定(bind)

标签 android kotlin observable android-databinding

我正在尝试编写一个自定义委托(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)
}

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

相关文章:

android - 如何通过 Espresso 检查拨号器上的电话号码 - 通过 autoLink 触发的拨号器

java - Android Studio 无法找到有效的 JVM Android Studio 1.2 OSX

android - 在键盘上方显示按钮

gradle - 如何在 gradle build 中定义可重用的 block

angular - 将 http post1 的响应传递给另一个并从 Angular 中的 post2 获取响应

rxjs - 使用 scan Observable 返回默认值

Android Studio 在 M 预览中找不到 aapt

java - 从 backstack 中删除不在 backstack 顶部的特定 fragment

collections - 映射列表值以列出一个类轮

javascript - Map 方法内的异步 Observable 方法