作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图实现类似于 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/
我是一名优秀的程序员,十分优秀!