我使用了挂起例程构建器来使Firebase任务从基于异步侦听器的代码转移到基于协程的代码。
这是我的suspendcoroutine,通过它我实现了协程行为。
suspend fun <T> Task<T>.awaitTask(): T =
suspendCoroutine { continuation ->
addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result!!)//what to do if task.result is null
} else {
continuation.resumeWithException(task.exception!!)
}
}
}这就是我调用它的方式
firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()在我们执行一个可能出现空结果的任务之前,一切都运行得很好。就像。
firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()在这里成功更新后,task.result为空。在这种情况下,应该将什么传递给continuation.resume?
发布于 2019-03-25 16:16:26
您的返回类型应为nullable,因为Task.getResult()可以为nullable:
suspend fun <T> Task<T>.await() : T? = ...如果您使用它来获得不可为空的结果,那么在使用站点而不是在实现中强制非为空。
但是,既然已经在kotlinx-coroutines-play-services中定义了它,为什么还要费心重新实现它呢
https://stackoverflow.com/questions/55333512
复制相似问题