kotlin - 有没有办法在 kotlin 中编写可暂停的委托(delegate)属性?

标签 kotlin delegates coroutine kotlin-coroutines

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

让我们来看以下简单用例:

  • 我有两个变量,分别是 var voltage: Floatvar 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 中的 getValuesetValue 函数不可暂停。 也不支持 suspend operator getValue() 语法。

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

最佳答案

一般情况下,属性应该很简单并且返回速度应该很快。他们不应该暴露任何东西以保证暂停,但这只是一种意见。

目前无法执行此操作,但存在 YouTrack 问题 herehere关于这个。

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

关于kotlin - 有没有办法在 kotlin 中编写可暂停的委托(delegate)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064438/

相关文章:

android - 何时使用 withContext?

java - 如何用 Java 或 Kotlin 解析大型 YAML 文件?

kotlin - 在 Kotlin 中创建私有(private)内部类的公共(public)实例

android - 如何在 Android Studio 中的模块中使用不同的 Kotlin 版本(WearOS 模块)

c# - 为什么协程停止工作/执行

python - Tornado 协程在 Cython 中不起作用

android Glide 资源已准备好但图像未显示

ios - UIView 中 UIImageView 的手势识别器

c# - 修复委托(delegate)的 'method group' 问题

c# - 委托(delegate)在依赖注入(inject)中扮演什么角色?