我正在尝试使用kotlin提供的称为delegate
的特殊功能来实现类似于Process Variables的功能。
让我们来看一个简单的用例:
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)
调用完成时返回。 最佳答案
通常,属性应该简单并且应该快速返回。他们不应该公开任何理由予以暂停,但这只是一个意见。
目前无法执行此操作,但与此相关的是YouTrack问题here和here。
您也可以尝试使用可能适合您需要的runBlocking
或GlobalScope.launch
。