Skip to content

Commit 9d93a95

Browse files
committed
Add toFlow extensions to DocumentSnapshot and Query
1 parent ece89bc commit 9d93a95

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

firebase-firestore/ktx/ktx.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ dependencies {
5151
implementation project(':firebase-common:ktx')
5252
implementation project(':firebase-firestore')
5353
implementation 'androidx.annotation:annotation:1.1.0'
54+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
5455
testImplementation project(':firebase-database-collection')
5556
testImplementation 'org.mockito:mockito-core:2.25.0'
5657
testImplementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'

firebase-firestore/ktx/src/main/kotlin/com/google/firebase/firestore/ktx/Firestore.kt

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@ import androidx.annotation.Keep
1818
import com.google.firebase.FirebaseApp
1919
import com.google.firebase.components.Component
2020
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
2723

2824
import com.google.firebase.ktx.Firebase
2925
import 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]. */
3230
val 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

Comments
 (0)