2017-09-04 59 views
3

我正在嘗試編寫一個自定義代理,它將清理Kotlin類中數據綁定的語法。這將消除爲每個我想要觀察的屬性定義自定義getter和setter的需要。與Kotlin,BaseObservable和一個自定義代理的Android數據綁定

在科特林的標準實現看起來如下:

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。

任何指導,將不勝感激。

回答

6

您可以在不提供主體的情況下注釋默認獲取器或設置器。

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