当前位置: 首页 > 知识库问答 >
问题:

如何使用Kotlin中的await()使用Firestore databse:addSnapshotListener?

文德曜
2023-03-14
 suspend fun fetchHubList(): ArrayList<HubModel>? = try {
        val hubList = ArrayList<HubModel>()

        hubsListCollection.get().await().map { document ->

            if (document != null) {

                Log.d(TAG, "Data fetch successful!")
                Log.d(TAG, "the document id is ${document.id}")

                val temp = HubModel(document.get("hubName").toString(),
                                    document.id.toString(),
                        document.get("isAdmin") as Boolean)
                hubList.add(temp)

                     //   hubList.add(document.toObject(HubModel::class.java))

            } else {
                Log.d(TAG, "No such document")
            }

        }
suspend fun fetchHubList(): ArrayList<HubModel>? = try {
        val hubList = ArrayList<HubModel>()

        hubsListCollection.addSnapshotListener().await().map { document ->

            if (document != null) {

                Log.d(TAG, "Data fetch successful!")
                Log.d(TAG, "the document id is ${document.id}")

                val temp = HubModel(document.get("hubName").toString(),
                                    document.id.toString(),
                        document.get("isAdmin") as Boolean)
                hubList.add(temp)

                     //   hubList.add(document.toObject(HubModel::class.java))

            } else {
                Log.d(TAG, "No such document")
            }

        }

我在ViewModel类中使用这个函数来创建LiveData包装的ArrayList:

val hubList =  MutableLiveData<ArrayList<HubModel>>()
    private val hubListDao = HubListDao()
    init {
        viewModelScope.launch {

            hubList.value = hubListDao.fetchHubList()
        }
    }

提前感谢!

共有1个答案

上官波鸿
2023-03-14

您不需要AddSnapshotListener,只需使用get:

hubsListCollection.get().await()

为了观察集合中的更改,可以扩展LiveData:

class CafeLiveData(
    private val documentReference: DocumentReference
) : LiveData<Cafe>(), EventListener<DocumentSnapshot> {

    private var snapshotListener: ListenerRegistration? = null

    override fun onActive() {
        super.onActive()
        snapshotListener = documentReference.addSnapshotListener(this)
    }

    override fun onInactive() {
        super.onInactive()
        snapshotListener?.remove()
    }

    override fun onEvent(result: DocumentSnapshot?, error: FirebaseFirestoreException?) {
        val item = result?.let { document ->
            document.toObject(Cafe::class.java)
        }
        value = item!!
    }
}

并从视图模型中公开它:

fun getCafe(id: String): LiveData<Cafe> {
    val query = Firebase.firestore.document("cafe/$id")
    return CafeLiveData(query)
}
 类似资料:
  • 我开玩笑地增加,减少物品数量。我想算数。文本加上“T”字符。当我试图编写这样的代码时。错误代码:java.lang.NumberFormatException:对于输入字符串:“1T”如何解决此问题?有人能帮忙吗??

  • 我已经复习了/,在复习了几篇文章之后,我决定自己测试一下。然而,我似乎无法理解为什么这不起作用: 控制台输出以下内容(节点V8.6.0): >外:“对象承诺” >内部:嘿那里 为什么函数内部的日志消息会在之后执行?我认为创建/的原因是为了使用异步任务执行同步执行。 有没有一种方法可以使用函数内部返回的值,而不用后面的?

  • [{“id”:1,“first_name”:“Lillis”,“last_name”:“Hawgood”,“cars”:[{“item”:“Savana 1500”},{“item”:“Vibe”},{“item”:“Estate”}]}] 数据类MyData(val id:Int=0,val first_name:String=“”,val last_name:String=“”,val car

  • 问题内容: 我正在尝试为Node v6.9.2配置Babel。我想使用/ 构造。 因为我是Babel和所有Node基础架构的新手,所以我对如何正确配置它感到困惑: 我应该使用什么预设?ES6的大多数功能已经实现了Node。因此,出于性能原因,我不希望Babel移植Node 6.9.x已经支持的功能(箭头功能,新的导入机制等)。 我应该包括哪些插件,以便可以使用异步/等待?我也感到困惑,因为经过一番

  • 问题内容: 我得到了asyncio在Python 3.5 中使用的流程,但是我还没有看到关于我应该使用什么东西,我不应该使用的await东西或者它在哪里容易出现的描述。我是否仅需要根据“这是IO操作并应进行await编辑” 来做出最好的判断? 问题答案: 默认情况下,所有代码都是同步的。你可以使用使其异步定义函数,async def并使用来“调用”这些函数await。一个更正确的问题是“什么时候应

  • Kotlin 如何使用 SearchBar + SearchView? https://m3.material.io/components/search/overview 显示 Jetpack Compose 的还在计划中,但是有 MDC 的 能否在 Kotlin 里使用 MDC 提供的 SearchBar + SearchView? 如果可以,应该怎么使用?