A better implementation has been merged into the official kotlin/kotlinx.coroutines repository.
Please, use the official implementation instead.
Integration with Firebase Task and DatabaseReference for Android.
Extension functions:
Name | Description |
---|---|
Task.await | Awaits for completion of the Task and return the result |
DatabaseReference.readValue | Awaits for a single value to be retrieved from Firebase Database |
DatabaseReference.readList | Awaits for a List of values to be retrieved from Firebase Database |
The following code shows how to get an user from Firebase and delete it using two approaches.
The standard approach is to write nested callback functions.
val auth = FirebaseAuth.getInstance()
auth.getUserByEmail(email)
.addOnSuccessListener { user ->
auth.deleteUser(user.uid)
.addOnSuccesListener { println("User deleted") }
.addOnFailureListener { exception -> println(exception) }
}
.addOnFailureListener { exception -> println(exception) }
The other approach is the use of a suspended coroutine
to make the code flatter, so we can call the await()
method
to wait the first asyncronous operations (retrieve the user) to complete before starting the second one (delete the user).
val auth = FirebaseAuth.getInstance()
try {
val user = auth.getUserByEmail(email).await()
auth.deleteUser(user.uid).await()
println("User deleted")
} catch (exception: FirebaseAuthException) {
println(exception)
}
Another usage of this module is to access nodes from a Firebase Database instance.
There are two suspend functions
that encapsulate callbacks: readValue
and readList
.
The usage of both methods can be seen in the code below. It shows how to read a a single value using readValue
to read the player name and readList
function to read his/her last five points in the game.
val database = FirebaseDatabase.getInstance()
val gameNode = database.getReference("game")
val person = gameNode.child("player").readValue<String>()
val scores = gameNode.child("scores").readList<Int>()
println("Scores of $person")
scores.forEach(::println)
It's important to mention that since this modules exposes coroutines,
they must be run inside a context like launch {}
, async {}
or runBlocking
for testing purpose.
Integration with Firebase Task and DatabaseReference for Android.