當使用我的flutter應用程式在沒有網路連接的情況下請求Firestore資料時,當資料沒有被快取時,我會期待一個FirebaseException。
例子:
try {
return await FirebaseFirestore.instance.collection(" songs").get()。
} on FirebaseException catch(e) {
log(e.toString())。
return null。
}
但這種情況從未發生。 get()回傳一個QuerySnapshot,而不是一個空的檔案串列。注意:我剛剛從設備中洗掉了快取的資料,所以不應該存在任何快取的檔案。
當明確地只從服務器上請求資料時,就會像預期的那樣拋出例外:
try {
return await FirebaseFirestore.instance.collection(" songs")
.get(GetOptions(source: Source.server)。
} on FirebaseException catch(e) {
log(e.toString())。
return null。
}
這是預期的行為嗎?我的客戶端甚至不應該知道這個集合是否存在。客戶端應該如何區分一個失敗的網路請求和一個成功的請求,但服務器上有一個空的集合呢?
uj5u.com熱心網友回復:
客戶端應該如何區分...
我通常發現,將這個問題改為 "為什么",更容易解決這類問題。那么:為什么客戶端應該區分一個失敗的網路請求和一個成功的請求,但服務器上有一個空的集合呢?
通常情況下,這是因為你正在尋找寫入/更新一個檔案,而且可能存在來自不同用戶的沖突寫入。在這種情況下,您可能應該使用事務,這樣也就解決了獲得虛假的不存在的檔案快照的問題,因為在發生這種情況時,事務將自動重試。
uj5u.com熱心網友回復:
為了區分一個失敗的網路請求和一個成功的網路請求,而服務器上有一個空的集合,你可以使用isFromCache屬性的快照,它是由get()方法回傳。感謝Frank van Puffelen!
下面是一個解決方法。
下面的解決方法為我解決了這個問題:
。
final snapshot = return await FirebaseFirestore.instance
.collection(" songs").get()。
if (snapshot.docs.isEmpty && snapshot.metadata.isFromCache) {
return null;
} else {
return snapshot;
...但不是100%,這對我的應用程式來說很好。我認為這只是快取的一個限制。你永遠不知道快取中的資料是否真的是最新的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332976.html
標籤:
