aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/state/ObservableList.kt5
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/state/ObservableState.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/state/StateBinding.kt9
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.