kotlin 未解析引用invokeOnCancellation

rvpgvaaj  于 2023-05-01  发布在  Kotlin
关注(0)|答案(1)|浏览(217)

我还在学习Kotlin,就像我一样。...
为什么我会得到一个“unresolved reference invokeOnCancellation”,下面的代码

suspend fun getEntireJobMapFromFirebase() = suspendCoroutine<Unit> { continuation ->

        val database = Firebase.database
        val job = database.getReference("jobs")
        val listener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                // This method is called whenever data at this location is updated.
                Log.d(jobMapTag, "job map value from firebase is: $dataSnapshot")
                commonViewModel.updateJobCategoryList(dataSnapshot)
            }

            override fun onCancelled(error: DatabaseError) {
                // Failed to read value
                Log.w(jobMapTag, "Failed to read value.", error.toException())
                continuation.resumeWithException(error.toException())
            }
        }
        job.addValueEventListener(listener)
        continuation.invokeOnCancellation { job.removeEventListener(listener) }
        // remove the listener when the coroutine is cancelled

    }

我有依赖关系implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
即使换成继续。invokeOnCompletion {}它仍然是一个未解析的引用
先谢了

x4shl7ld

x4shl7ld1#

您使用的是suspendCoroutine,因此continuation变量的类型是Continuation<Unit>。此类型没有您尝试使用的方法或扩展,因此出现错误。
invokeOnCancellation定义在CancellableContinuation上,如果使用suspendCancellableCoroutine,则会得到CancellableContinuation
invokeOnCompletion定义在Job类型上,在本例中,invokeOnCompletion是不相关的类型。
退一步讲,我并不精通Firebase API,但似乎您试图将多镜头回调 Package 到挂起函数中,这是不合适的。这种带有suspendCancellableCoroutine的适配器旨在 Package 基于回调的函数,这些函数只会触发一次回调(当它们获得结果或错误时)。
如果您确实想监听单个事件,可能您想调用addListenerForSingleValueEvent。但如果这不是出于学习目的,请注意已经有了Task API的 Package 器。例如,您可以使用Task<T>.await()扩展名:https://github.com/Kotlin/kotlinx.coroutines/tree/master/integration/kotlinx-coroutines-play-services
对于多次回调,您可能希望将Firebase API Package 到callbackFlow中。

相关问题