Android与Kotlin、BaseObservable和自定义委托的数据绑定
我正在尝试编写一个自定义委托,它将清理Kotlin类中数据绑定的语法。这将消除为我可能要观察的每个属性定义自定义getter和setter的需要 Kotlin的标准实施情况如下: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
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)
}
}