Пользовательский сеттер для mutableStateOf () / MutableState в Котлине?

Есть ли способ переопределить установщик для базового значения 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

Это связано с этим вопросом, но ответы ищут только изменения состояния (автоматически обновляет значение). Я хочу изменить состояние, только если выполняется условие.

0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пока наш код основан на интерфейсах, мы всегда можем использовать композицию и делегирование для решения подобных проблем. В этом случае мы можем создать собственную реализацию 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
                }
            }
    }
}

Другие вопросы по теме