Пользовательский сеттер для 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

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

Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
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
                }
            }
    }
}

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