diff options
Diffstat (limited to 'src/main/kotlin/pl/treksoft/kvision')
3 files changed, 13 insertions, 3 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/state/ObservableList.kt b/src/main/kotlin/pl/treksoft/kvision/state/ObservableList.kt index 92109814..7d41e05c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/state/ObservableList.kt +++ b/src/main/kotlin/pl/treksoft/kvision/state/ObservableList.kt @@ -35,9 +35,12 @@ interface ObservableList<T> : MutableList<T>, ObservableState<List<T>> { class ObservableListWrapper<T>(val mutableList: MutableList<T> = mutableListOf()) : MutableList<T>, ObservableList<T>, ObservableState<List<T>> { - override fun subscribe(observer: (List<T>) -> Unit) { + override fun subscribe(observer: (List<T>) -> Unit): () -> Unit { onUpdate += observer observer(this) + return { + onUpdate -= observer + } } override val onUpdate: MutableCollection<(MutableList<T>) -> Unit> = mutableListOf() diff --git a/src/main/kotlin/pl/treksoft/kvision/state/ObservableState.kt b/src/main/kotlin/pl/treksoft/kvision/state/ObservableState.kt index 9dc9af0d..f1cba7f0 100644 --- a/src/main/kotlin/pl/treksoft/kvision/state/ObservableState.kt +++ b/src/main/kotlin/pl/treksoft/kvision/state/ObservableState.kt @@ -28,5 +28,5 @@ interface ObservableState<S> { /** * Subscribe for the state change notifications. */ - fun subscribe(observer: (S) -> Unit) + fun subscribe(observer: (S) -> Unit): () -> Unit } diff --git a/src/main/kotlin/pl/treksoft/kvision/state/StateBinding.kt b/src/main/kotlin/pl/treksoft/kvision/state/StateBinding.kt index 7df82adc..adb7d3be 100644 --- a/src/main/kotlin/pl/treksoft/kvision/state/StateBinding.kt +++ b/src/main/kotlin/pl/treksoft/kvision/state/StateBinding.kt @@ -22,8 +22,10 @@ class StateBinding<S : Any, CONT : Container, CONTENT>( private val factory: (CONT.(S) -> CONTENT) ) : Widget(setOf()) { + private val unsubscribe: () -> Unit + init { - observableState.subscribe { update(it) } + unsubscribe = observableState.subscribe { update(it) } } private var updateState: ((S, CONTENT) -> Unit)? = null @@ -51,6 +53,11 @@ class StateBinding<S : Any, CONT : Container, CONTENT>( this.updateState = updateState } + override fun dispose() { + unsubscribe() + super.dispose() + } + companion object { /** * DSL builder extension function. |