簡體   English   中英

使用 Kotlin 流的 Firestore 實時更新

[英]Firestore live update using Kotlin Flow

我想用實時更新實現系統(類似於 onSnapshotListener)。 我聽說這可以用Kotlin Flow來完成。

那是我來自存儲庫的 function 。

 suspend fun getList(groupId: String): Flow<List<Product>> = flow {
        val myList = mutableListOf<Product>()
        db.collection("group")
            .document(groupId)
            .collection("Objects")
            .addSnapshotListener { querySnapshot: QuerySnapshot?,
                                   e: FirebaseFirestoreException? ->
                if (e != null) {}
                querySnapshot?.forEach {
                    val singleProduct = it.toObject(Product::class.java)
                    singleProduct.productId = it.id
                    myList.add(singleProduct)
                }
            }
       emit(myList)
    }

還有我的ViewModel

class ListViewModel: ViewModel() {

private val repository = FirebaseRepository()
private var _products = MutableLiveData<List<Product>>()
val products: LiveData<List<Product>> get() = _produkty


init {
    viewModelScope.launch(Dispatchers.Main){
        repository.getList("xGRWy21hwQ7yuBGIJtnA")
            .collect { items ->
                _products.value = items
            }
    }
}

我需要更改什么才能使其正常工作? 我知道數據是異步加載的,它目前不起作用(我發出的列表是空的)。

您可以使用我在項目中使用的這個擴展 function:

fun Query.snapshotFlow(): Flow<QuerySnapshot> = callbackFlow {
    val listenerRegistration = addSnapshotListener { value, error ->
        if (error != null) {
            close()
            return@addSnapshotListener
        }
        if (value != null)
            trySend(value)
    }
    awaitClose {
        listenerRegistration.remove()
    }
}

它使用callbackFlow構建器來創建一個新的流實例。

用法:

fun getList(groupId: String): Flow<List<Product>> {
    return db.collection("group")
        .document(groupId)
        .collection("Objects")
        .snapshotFlow()
        .map { querySnapshot ->
            querySnapshot.documents.map { it.toObject<Product>() }
         }
}

請注意,您不需要將getList標記為suspend

截至 2 天前,firestore 提供了開箱即用的此功能: https://github.com/firebase/firebase-android-sdk/pull/1252/

firestore-ktx:24.3.0 開始,您可以使用Query.snapshots() Kotlin 流程來獲取實時更新:

suspend fun getList(groupId: String): Flow<List<Product>> {
    return db.collection("group")
            .document(groupId)
            .collection("Objects")
            .snapshots().map { querySnapshot -> querySnapshot.toObjects()}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM