Как я могу дождаться ответа от Firebase использую kotlin coroutines?

fun getProducts(): ArrayList<User> {
    FirebaseDatabase.getInstance().getReference("Users")
        .addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for (ds in snapshot.children) {
                    list.add(ds.getValue(User::class.java))
                }
            }

            override fun onCancelled(error: DatabaseError) {
            }

        })

    return list
}

Как я могу дождаться заполнения списка и только потом вернуть его, используя kotlin coroutines? Я знаю что await используется когда нужно вернуть результат из асинхронной операции, но не понимаю как использовать его здесь


Ответы (1 шт):

Автор решения: ЮрийСПб

Это примерно так должно выглядеть:

suspend fun getProducts(): List<User> {
    return suspendCancellableCoroutine<List<User>> { cancellableContinuation ->
        FirebaseDatabase.getInstance().getReference("Users").addListenerForSingleValueEvent(object : ValueEventListener { cont ->
            override fun onDataChange(call: Call, e: IOException) {
                cancellableContinuation.resumeWith(Result.success(snapshot.children.map { it.getValue(User::class.java) }))
            }

            override fun onCancelled(error: DatabaseError)  {
                cancellableContinuation.cancel()
            }
        })
    }
}
→ Ссылка