Есть ли способ написать приостановленное делегированное свойство в kotlin? - PullRequest
1 голос
/ 23 сентября 2019

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

1 Ответ

1 голос
/ 23 сентября 2019

В общем случае свойства должны быть простыми и возвращаться быстро.Они не должны ничего подвергать приостановке, но это только мнение.

Сейчас нет способа сделать это, но есть проблема с YouTrack здесь и здесь по этому поводу.

Вы также можете попробовать использовать runBlocking или GlobalScope.launch, которые могут удовлетворить ваши потребности.

...