@@ -18,15 +18,13 @@ import androidx.annotation.Keep
1818import com.google.firebase.FirebaseApp
1919import com.google.firebase.components.Component
2020import com.google.firebase.components.ComponentRegistrar
21- import com.google.firebase.firestore.DocumentSnapshot
22- import com.google.firebase.firestore.FieldPath
23- import com.google.firebase.firestore.FirebaseFirestore
24- import com.google.firebase.firestore.QueryDocumentSnapshot
25- import com.google.firebase.firestore.QuerySnapshot
26- import com.google.firebase.firestore.FirebaseFirestoreSettings
21+ import com.google.firebase.firestore.*
22+ import com.google.firebase.firestore.util.Logger
2723
2824import com.google.firebase.ktx.Firebase
2925import com.google.firebase.platforminfo.LibraryVersionComponent
26+ import kotlinx.coroutines.channels.awaitClose
27+ import kotlinx.coroutines.flow.callbackFlow
3028
3129/* * Returns the [FirebaseFirestore] instance of the default [FirebaseApp]. */
3230val Firebase .firestore: FirebaseFirestore
@@ -163,3 +161,35 @@ class FirebaseFirestoreKtxRegistrar : ComponentRegistrar {
163161 override fun getComponents (): List <Component <* >> =
164162 listOf (LibraryVersionComponent .create(LIBRARY_NAME , BuildConfig .VERSION_NAME ))
165163}
164+
165+ /* *
166+ * Attach a snapshotListener to a DocumentReference and use it as a coroutine flow
167+ */
168+ fun DocumentReference.toFlow () = callbackFlow {
169+ val listener = addSnapshotListener { value, error ->
170+ if (value != null && value.exists()) {
171+ offer(value)
172+ } else if (error != null ) {
173+ Logger .warn(" DocumentReference:flow" , error.message)
174+ }
175+ }
176+ awaitClose {
177+ listener.remove()
178+ }
179+ }
180+
181+ /* *
182+ * Attach a snapshotListener to a Query and use it as a coroutine flow
183+ */
184+ fun Query.toFlow () = callbackFlow {
185+ val listener = addSnapshotListener { value, error ->
186+ if (value != null ) {
187+ offer(value)
188+ } else if (error != null ) {
189+ Logger .warn(" Query:flow" , error.message)
190+ }
191+ }
192+ awaitClose {
193+ listener.remove()
194+ }
195+ }
0 commit comments