Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android与Kotlin、BaseObservable和自定义委托的数据绑定_Android_Kotlin_Observable_Android Databinding - Fatal编程技术网

Android与Kotlin、BaseObservable和自定义委托的数据绑定

Android与Kotlin、BaseObservable和自定义委托的数据绑定,android,kotlin,observable,android-databinding,Android,Kotlin,Observable,Android Databinding,我正在尝试编写一个自定义委托,它将清理Kotlin类中数据绑定的语法。这将消除为我可能要观察的每个属性定义自定义getter和setter的需要 Kotlin的标准实施情况如下: class Foo : BaseObservable() { var bar: String @Bindable get() = bar set(value) { bar = value notifyPropertyCha

我正在尝试编写一个自定义委托,它将清理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)
     }
}
问题在于,如果Foo类中没有@Bindable注释,那么BR for bar中就不会生成propertyId。我不知道生成该属性id的任何其他注释或方法


任何指导都将不胜感激

可以在不提供正文的情况下注释默认的getter或setter

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)
}

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

class Foo(_bar: String) : BaseObservable() {
      @get:Bindable var bar by Delegates.observable(_bar) { _, _, _ ->
          notifyPropertyChanged(BR.bar)
      }
}
有时我们必须使用parcel保存对象,我在使用Deleget时遇到一些问题,因此代码如下所示:

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