Как я понимаю, вы хотите сделать свой код более чистым и последовательным при использовании обратного вызова Api. Вы можете использовать suspendCoroutine или suspendCancellableCoroutine .
suspendCoroutine
приостанавливает сопрограмму, в которой она выполнялась, до тех пор, пока мы не решим продолжить, вызвав соответствующие методы - Continuation.resume...
.
suspendCancellableCoroutine
функция, она ведет себя подобно suspendCoroutine
с дополнительной функцией - обеспечивает реализацию CancellableContinuation
для блока.
Для вашего примера это будет выглядеть примерно так:
suspend fun getHeroesFromCloud() = suspendCoroutine<List<Hero>> { continuation ->
db.collection("Heros")
.get()
.addOnSuccessListener { documentSnapshot ->
val heroList = ArrayList<Hero>()
if (documentSnapshot != null) {
for(heroDoc in documentSnapshot) {
heroList.add(heroDoc.toObject(Hero::class.java))
}
Log.d("newherosNames", "newdoorsNames data: ${heroList}")
} else {
Log.d("heros", "No such document")
}
continuation.resume(heroList)
}
.addOnFailureListener { exception ->
continuation.resumeWithException(exception)
Log.d("heros", "get failed with ", exception)
}
}
// Call this function from a coroutine
suspend fun someFun() {
val heroes = getHeroesFromCloud()
// use heroes
}