当前位置: 首页 > 知识库问答 >
问题:

使用属性作为 Kotlin 协程的访问器

水渊
2023-03-14

Kotlin Coroutines question...使用属性而不是函数作为异步调用的访问器。

背景是我试图将FusedLocationProviderClientkotlinx-coroutines-play-service库一起使用,以便在上使用. wait()方法任务而不是添加回调...

目前有一个属性getter调用挂起函数,但不确定如何正确启动协程以避免

所需单位找到XYZ

错误...

 val lastUserLatLng: LatLng?
        get() {
            val location = lastUserLocation
            return if (location != null) {
                LatLng(location.latitude, location.longitude)
            } else {
                null
            }
        }

    val lastUserLocation: Location?
        get() {
            GlobalScope.launch {
                return@launch getLastUserLocationAsync()  <--- ERROR HERE
            }
        }

    private suspend fun getLastUserLocationAsync() : Location? = withContext(Dispatchers.Main) {
        return@withContext if (enabled) fusedLocationClient.lastLocation.await() else null
    }

关于如何处理这个问题的任何想法?

共有1个答案

邢星波
2023-03-14

属性不能是异步的。通常,不应同步异步调用。您必须返回一个<code>延迟。

val lastUserLatLng: Deferredd<LatLng?>
    get() = GlobalScope.async {
        lastUserLocation.await()?.run {
            LatLng(latitude, longitude)
        }
    }

val lastUserLocation: Deferred<Location?>
    get() = GlobalScope.async {
        getLastUserLocationAsync()
    }

private suspend fun getLastUserLocationAsync() : Location? = withContext(Dispatchers.Main) {
    return@withContext if (enabled) fusedLocationClient.lastLocation.await() else null
}

但从技术上来说这是可能的,尽管你不应该这样做。< code>runBlocking()阻塞,直到有值可用并返回它。

 类似资料:
  • 使用Gradle 4.4.1和静态编程语言-DSL,我想在我的静态编程语言1.2.20项目中配置实验性的静态编程语言协程。这被证明是出奇困难的。 官方静态编程语言留档本身只提到Groovy DSL的Gradle,而不是静态编程语言。 Kotlin DSL项目有一个不起作用的协同路由示例。可能是针对较旧的Gradle版本(该脚本中的Kotlin版本为1.1.51,这本身就是可疑的)。 PS:甚至In

  • 问题内容: 因此,我可以使用进行访问,但如何访问? 问题答案: 您可以这样操作:

  • 在2.1版本中,Room增加了对协同程序的支持,但我无法让它工作。这应该和添加依赖项一样简单,但不知为什么我忽略了一些东西。 在我的build.gradle我有协程的依赖关系,房间和房间协程 我已经尝试重新同步gradle,清理和重建项目。 在我的Doa中,我有如下方法 当试图构建项目时,Room不知道如何处理挂起的功能,会发生以下错误: 我真的不知道我错过了什么,自从新的房间版本以来,我找不到有

  • 工作正常。 现在假设setter内部有一些复杂的功能,稍后Java类中的字段被更改为,而不是。不会出现编译错误,但Kotlin调用将更改的值,跳过setter中发生的其他事情,并且可能会被忽略,导致逻辑错误。因此,我想知道:使用Kotlin属性访问语法来设置java字段是否安全?

  • 我正在查询如下所示的帖子: 这将返回product类型的所有post。但我在wooCommerce中创建的产品上有自定义属性,但我似乎在任何地方都找不到这些信息。 我尝试使用: 我还尝试: 当我print_r这些我得到了很多信息但我不能看到的产品属性从WooCommerce任何地方 下图显示了如何在产品上设置此信息。 查询帖子后如何访问此信息?特别是我需要提取的颜色和大小。