有没有办法在kotlin中写入可挂起的委托属性?

有没有办法在kotlin中写入可挂起的委托属性?,kotlin,delegates,coroutine,kotlin-coroutines,Kotlin,Delegates,Coroutine,Kotlin Coroutines,我试图实现类似于使用kotlin提供的名为delegate的特殊功能的东西 让我们以以下简单用例为例: 我有两个变量叫做var-voltage:Float和var-light:Boolean 当电压大于5.0时,我想打开灯 当电压小于5.0时,我想关灯 注:每个变量更改都需要发布更改的值(涉及网络调用) 下面的代码片段捕获了上述用例 suspend fun publishLightStatus(status: Boolean): Unit = TODO() suspend f

我试图实现类似于使用kotlin提供的名为
delegate
的特殊功能的东西

让我们以以下简单用例为例:

  • 我有两个变量叫做
    var-voltage:Float
    var-light:Boolean
  • 电压
    大于5.0时,我想打开灯
  • 电压
    小于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
    }

suspend fun publishLightStatus(状态:布尔值):单位=TODO()
暂停电压(电压:浮动):单位=TODO()
fun subscribeToVoltage(block:(Float)->Unit):Unit=TODO()
var灯光:代理的布尔值。可观察(假){{uu,{uu,n->
publishLightStatus(n)
}
无功电压:由代表浮动。可观察(0F){{},n->
如果(n>5.0)灯光=真
否则,如果(n<5.0)灯光=假
出版电压(n)
}
//用法
下标电压{
电压=it
}
上述代码未编译,因为当前
属性委托
不支持挂起。
ReadWriteProperty
中的
getValue
setValue
函数不可挂起。 另外,不支持
suspend operator getValue()
语法

我有什么办法可以解决这个问题吗? 我真的不想与网站代码的使用妥协。
另一件重要的事情,
voltage=it
这应该在
publishVoltage(n)
调用完成时返回。

一般来说,属性应该简单并且应该快速返回。他们不应该揭露任何值得停职的事情,但这只是一种意见

目前没有办法做到这一点,但YouTrack存在一个问题,并且与此相关

您还可以尝试使用
runBlocking
GlobalScope.launch
来满足您的需要