我试图实现类似于 Process Variables 的东西使用 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
}
以上代码无法编译,因为当前 property delegates
不支持暂停。
ReadWriteProperty
中的 getValue
和 setValue
函数不可暂停。
也不支持 suspend operator getValue()
语法。
我有办法解决这个问题吗?
我真的不想与使用站点代码妥协。
另一件重要的事情是,voltage = it
这应该在 publishVoltage(n)
调用完成时返回。
最佳答案
一般情况下,属性应该很简单并且返回速度应该很快。他们不应该暴露任何东西以保证暂停,但这只是一种意见。
目前无法执行此操作,但存在 YouTrack 问题 here和 here关于这个。
您也可以尝试使用 runBlocking
或 GlobalScope.launch
,它们可能适合您的需要。
关于kotlin - 有没有办法在 kotlin 中编写可暂停的委托(delegate)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064438/