Я использовал подпрограмму приостановки рутин, чтобы заставить задачи Firebase перейти от кода на основе асинхронного слушателя к коду на основе сопрограмм.
Это моя приостановка, с помощью которой я достигаю поведения сопрограммы.
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 имеет значение null. В таком случае, что следует передать в продолжение.resume?.