Я пытался реализовать что-то похожее на Переменные процесса , используя специальную функцию delegate
, предоставляемую kotlin.
Давайте рассмотрим следующий простой пример использования:
- У меня есть две переменные с именами
var voltage: Float
и var light: Boolean
- Когда
voltage
становится больше 5,0, я хочу включить свет - Когда
voltage
становится меньше 5,0,Я хочу выключить свет
Обратите внимание, что каждое изменение переменной должно публиковать измененное значение (включает сетевой вызов)
Приведенный выше случай использования зафиксирован в следующем фрагменте кода
suspend fun publishLightStatus(status: Boolean): Unit = TODO()
suspend fun publishVoltage(voltage: Float): Unit = TODO()
fun subscribeToVoltage(block: (Float) -> Unit): Unit = TODO()
var light: Boolean by Delegates.observable(false) { _, _, n ->
publishLightStatus(n)
}
var voltage: Float by Delegates.observable(0F) { _, _, n ->
if(n > 5.0) light = true
else if (n < 5.0) light = false
publishVoltage(n)
}
// usage
subscribeToVoltage {
voltage = it
}
Выше код не компилируется, потому что в настоящее время property delegates
не поддерживает приостановки.Функции getValue
и setValue
из ReadWriteProperty
не приостанавливаются.Также синтаксис suspend operator getValue()
не поддерживается.
Есть ли способ обойти это? Я действительно не хочу идти на компромисс с использованием кода сайта использования.Еще одна важная вещь, voltage = it
должна возвращаться, когда publishVoltage(n)
вызов завершен.