我正在尝试使用kotlin提供的称为delegate的特殊功能来实现类似于Process Variables的功能。

让我们来看一个简单的用例:

  • 我有两个变量,分别称为var voltage: Floatvar 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中的setValueReadWriteProperty函数不可挂起。
    另外,不支持suspend operator getValue()语法。

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

    最佳答案

    通常,属性应该简单并且应该快速返回。他们不应该公开任何理由予以暂停,但这只是一个意见。

    目前无法执行此操作,但与此相关的是YouTrack问题herehere

    您也可以尝试使用可能适合您需要的runBlockingGlobalScope.launch

    07-26 08:02