【发布时间】:2021-06-26 17:52:22
【问题描述】:
我有一个 DAO 类,其中我有 fetchHubList 方法,该方法使用 await() 从云 Firestore 异步获取文档集合。这个实现使用了我后来知道的“get()”方法,它不会获取实时更新。在尝试使用 onSnapshotListener 类似地实现代码时会出现错误(这是很诚实的,因为 get() 和此方法返回完全不同的东西)。有谁知道如何实现这个?
代码目前如何:
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()
}
}
提前致谢!
【问题讨论】:
-
一个快照监听器可以触发多次,而
await()只等待一个结果。两种范式不匹配。为什么要使用快照侦听器? -
我想使用 smapshot 监听器来监听我的数据库中可能发生的变化以更新我的回收站视图
-
在这种情况下,您不能
await()来自数据库的结果,因为await只需要一次数据。我不是MutableLiveData方面的专家,但看来您可能正在寻找postValue:stackoverflow.com/questions/44204978/… -
@FrankvanPuffelen 我认为 postValue 在这里没有多大帮助。我实际上正在寻找的是一种异步执行快照侦听的方法。如果我不能使用等待,那么我是否必须使用 GloabalScope(Dispatchers.IO) 之类的东西?那么是的,我猜后值会有所帮助
-
只是好奇。我应该使用 kotlin Flows 吗?
标签: android firebase kotlin google-cloud-firestore kotlin-coroutines