【问题标题】:Use Kotlin coroutines for real time Firestore updates使用 Kotlin 协程进行实时 Firestore 更新
【发布时间】:2021-01-01 10:56:23
【问题描述】:

从 Firestore 获取一次性数据时,我可以使用 kotlinx-coroutines-play-services 库删除回调:

使用回调

firestore.collection("Users")
    .document(userId)
    .get()
    .addOnSuccessListener { snapshot ->
        // Handle snapshot
    }
    .addOnFailureListener { exception ->
        // Handle exception
    }

使用await() 和协程

try {
    val snapshot = firestore.collection("Users")
        .document(userId)
        .get().await()
    // Handle snapshot
} catch(exception: Exception) {
    // Handle error
}

我正在寻找一种类似的实时更新方法。 addSnapshotListener() 是否有 await() 等效项?

firestore.collection("Users")
    .document(userId)
    .addSnapshotListener { snapshot, exception ->
        // Listen to snapshot in real time
    }

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore kotlin-coroutines


    【解决方案1】:

    Firestore 侦听器从根本上与协程不兼容,因为它们不会生成单个项目以供消费。您不能“等待”随着时间推移发生的一系列回调(没有明显的终止点)。

    映射到听众的最自然的 Kotlin 概念是 flow。流可以随着时间的推移产生一系列值,如果您愿意,可以在协程上下文中使用它们。您必须编写一些代码来将该侦听器转换为流(搜索这些关键字以查看其他人做了什么)。

    【讨论】:

    • 要加上 Dougs 的答案,@real_shardul,您仍然需要使用 addOnSnapshotListener 回调向您的表示层发出(提供)数据流,以便稍后收集它们。注意不要在存储库/数据源类中使用 LiveData,而是使用流更好地在这些层与表示层之间进行通信
    • 将 Kotlin 流与 addOnSnapshotListener 一起使用有什么好处吗?答案here 似乎增加了样板文件,其中一些正在使用实验性 API。我的用例是从 addOnSnapshotListener 更新 LiveData 对象。
    猜你喜欢
    • 2022-08-15
    • 2021-05-19
    • 2019-02-13
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多