Colton Idle
08/06/2022, 5:34 AMfun getBooks(): Flow<List<Book>> {
return callbackFlow {
val listener =
FirebaseFirestore.getInstance().collection("books").addSnapshotListener { value, error -> trySend(value to error) }
awaitClose { listener.remove() }
}
.doSomethingWithNullValueAndError()
.conflate()
.map { (value, _) ->
value.toObjects()
}
.flowOn(defaultDispatcher)
fun getBooks(): Flow<List<Book>> {
val query = FirebaseFirestore.getInstance().collection("books")
return getFirestoreFlowable(query, Book.class::java)
}
and
fun getPeople(): Flow<List<Person>> {
val query = FirebaseFirestore.getInstance().collection("person"). .whereEqualTo("person.visibility", true)
return getFirestoreFlowable(query, Person.class::java)
}
and then I'd have a generic
fun <T> getFirestoreFlowable(query: Query, type: T): Flow<T> {
return callbackFlow {
val listener =
query.addSnapshotListener { value, error -> trySend(value to error) }
awaitClose { listener.remove() }
}
.doSomethingWithNullValueAndError()
.conflate()
.map { (value, _) ->
value.toObjects()
}
.flowOn(defaultDispatcher)
Does that sound or look alright?Joffrey
08/07/2022, 2:48 PMdoSomethingWithNullValueAndError()
? If you're throwing on errors, why not just do it with the close(Throwable)
from inside the callbackFlow
?
Also, I'd rather declare such functions as extensions, for instance an extension function on Query
heretype
here?Colton Idle
08/07/2022, 5:35 PMdoSomethingWithNullValueAndError()
from a snippet that @uli was helping me with. An exntention function on query makes sense here to me.
Where do I use type... Hm. I need it for the value.toObjects()
so that it knows what type to return