【问题标题】:Android data binding with Kotlin, BaseObservable, and a custom delegate与 Kotlin、BaseObservable 和自定义委托的 Android 数据绑定
【发布时间】:2017-09-04 02:31:23
【问题描述】:

我正在尝试编写一个自定义委托,它将清理 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 的任何其他注释或方法。

任何指导将不胜感激。

【问题讨论】:

    标签: android kotlin observable android-databinding


    【解决方案1】:

    您可以在不提供正文的情况下注释默认的 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)
    }
    

    【讨论】:

      【解决方案2】:

      除了接受的答案 - 有时您需要在构造函数中传递变量。也很容易做到。

      class Foo(_bar: String) : BaseObservable() {
            @get:Bindable var bar by Delegates.observable(_bar) { _, _, _ ->
                notifyPropertyChanged(BR.bar)
            }
      }
      

      有时我们必须使用 parcel 来保存对象,我在使用 delegete 时遇到了一些问题,所以代码如下所示:

      @Parcelize
      class Foo(private var _bar: String) : BaseObservable(), Parcelable {
          @IgnoredOnParcel
          @get:Bindable var bar 
          get() =  _bar
          set(value) {
              _bar = value
              notifyPropertyChanged(BR.bar)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-07
        • 2016-06-19
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2017-10-01
        • 2020-03-23
        相关资源
        最近更新 更多