An easy to use kotlin library for observable properties.
To use this library simply add this to your build.gradle
repositories {
jcenter()
}
dependencies {
implementation "de.westermann:KObserve-jvm:$version"
}
To use it with javascript or common modules replace KObserve-jvm
with KObserve-js
or KObserve-metadata
respectively.
When you use this library in common modules you need to add the platform specific dependency to each depending module.
An easier method is to enable gradle_metadata
an experimental feature for gradle 5. This will automatically determine the target platform and include the necessary dependency.
Add this to your settings.gradle
enableFeaturePreview('GRADLE_METADATA')
And update your build.gradle
repositories {
jcenter()
}
dependencies {
implementation "de.westermann:KObserve:$version"
}
val onRandomNumber = EventHandler<Int>()
onRandomNumber { number -> Int
println("The random number is $number!")
}
onRandomNumber.emit(5)
For advanced usage you can obtain a event listener reference or combine event handlers.
val addedReference = onRandomNumber.reference {
println("This listener can be removed easily.")
}
addedReference.remove()
val onFoo = EventHandler<Int>()
val onBar = EventHandler<Double>()
(onRandomNumber + onFoo) { number: Int ->
println("The int is $number!")
}
onFoo.and<Number>(onFoo) { number: Number ->
println("The number is $number!")
}
Create a simple object property with the property(T)
function:
val numberProperty: ObjectProperty<Int> = property(0)
var number: Int by numberProperty
numberProperty.onChange {
println("Number has been changed!")
}
number = 2
or use the observe()
extension function:
val numberProperty: ObjectProperty<Int> = 0.observe()
You can map each property to observe a member property:
class Person(
var name: String
)
val personProperty = Person("John Doe").observe()
val nameProperty = personProperty.map(Person::name)
var name: String by namePropery
or a computed value:
val nameLengthProperty = nameProperty.map { it.length }
val personList = observableListOf<Person>()
val mappedList = personList.mapObservable {
it.name
}
val filteredList = personList.filterObservable {
it.name.length > 5
}
val sortedList = personList.sortObservable(Comparator { p1, p2 ->
p1.name.compareTo(p2.name)
})
val number1 = property(5)
val number2 = property(10)
val calcProperty = (number1 + number2) * number1