我还在学习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 {}它仍然是一个未解析的引用
先谢了
1条答案
按热度按时间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中。