bbaldino
04/27/2022, 4:49 PM@Serializable
class Foo {
var id: String by Delegates.observable("initialId", ::onChange)
private fun onChange() {
keyStore.set("foo", Json.encodeToString(this))
}
}
but this won’t work because delegates don’t get serialized. Is there a good way to accomplish something like this?Oliver.O
04/27/2022, 6:41 PM_id
, which is then serialized, like so:
import kotlinx.serialization.Serializable
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KMutableProperty0
import kotlin.reflect.KProperty
@Serializable
class Foo {
private var _id: String = "initialId" // <-- will be serialized
var id: String by MyObservable<Foo, String>(this::_id, Foo::onChange) // <- will not be serialized
private fun onChange() {
println("changed to $id")
}
}
class MyObservable<in Owner, Value>(
private var propertyReference: KMutableProperty0<Value>,
val onChange: Owner.() -> Unit
) : ReadWriteProperty<Owner, Value> {
override fun getValue(thisRef: Owner, property: KProperty<*>): Value = propertyReference.get()
override fun setValue(thisRef: Owner, property: KProperty<*>, value: Value) {
propertyReference.set(value)
thisRef.onChange()
}
}
bbaldino
04/27/2022, 8:08 PM