@@ -18,15 +18,13 @@ import androidx.annotation.Keep
18
18
import com.google.firebase.FirebaseApp
19
19
import com.google.firebase.components.Component
20
20
import 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
27
23
28
24
import com.google.firebase.ktx.Firebase
29
25
import com.google.firebase.platforminfo.LibraryVersionComponent
26
+ import kotlinx.coroutines.channels.awaitClose
27
+ import kotlinx.coroutines.flow.callbackFlow
30
28
31
29
/* * Returns the [FirebaseFirestore] instance of the default [FirebaseApp]. */
32
30
val Firebase .firestore: FirebaseFirestore
@@ -163,3 +161,35 @@ class FirebaseFirestoreKtxRegistrar : ComponentRegistrar {
163
161
override fun getComponents (): List <Component <* >> =
164
162
listOf (LibraryVersionComponent .create(LIBRARY_NAME , BuildConfig .VERSION_NAME ))
165
163
}
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