Есть ли способ переопределить установщик для базового значения MutableState
В основном я хочу добиться точного поведения не MutableState
object MyClass2 {
val myProperty2: Int = 0
set(value) {
if (value>= 0) {
field = value
}
}
}
Использование myProperty2 = -3
выполнит мой пользовательский сеттер и не обновит значение, поскольку условие if
не выполнено.
object MyClass1 {
val myProperty1: MutableState<Int> = mutableStateOf(0)
set(value) {
if (value.value >= 0) {
field = value
}
}
}
Использование myProperty1.value = -3
НЕ приведет к выполнению моего пользовательского установщика, поскольку я изменяю базовое значение, а не сам MutableState
Это связано с этим вопросом, но ответы ищут только изменения состояния (автоматически обновляет значение). Я хочу изменить состояние, только если выполняется условие.
Пока наш код основан на интерфейсах, мы всегда можем использовать композицию и делегирование для решения подобных проблем. В этом случае мы можем создать собственную реализацию MutableState
, а затем реализовать все в соответствии с нашими потребностями, возможно, делегируя исходное изменяемое состояние везде, где это имеет смысл:
val myProperty1 = run {
val state = mutableStateOf(0)
object : MutableState<Int> by state {
override var value: Int
get() = state.value
set(value) {
if (value > 0) {
state.value = value
}
}
}
}