【发布时间】:2020-04-24 22:15:35
【问题描述】:
据我所知,Flutter 上的 Firebase 将首先自动从缓存中读取,但我注意到在开发过程中,一个应用程序只使用了几乎 1 个具有 10 或 15 个文档的流,我已经达到了 4000 次以上的读取!通过这种方式,如果有 10 个用户使用了我的应用程序,我将支付我所有的费用,所以我会重新检查每个查询、快照并将此代码知道
print(itemDoc.metadata.isFromCache ? "itemDoc NOT FROM NETWORK" : "itemDoc FROM NETWORK");
编辑写代码和更多解释
当我更新、添加、删除文档控制台打印所有存储的文档时,我注意到这个问题出现在 IOS 中。
我有获取所有用户列表的 Main Stream 然后我为它创建流的每个列表来监听列表的项目
userListsStream(uid){
Stream<QuerySnapshot> shoppingListsStream =
Firestore.instance.collection('lists').where('owner', arrayContains: uid).snapshots();
shoppingListsStream.listen(
(QuerySnapshot listsQuery) async {
List<DocumentSnapshot> listsDocs = listsQuery.documents;
if (listsDocs.length != 0) {
//? foreach on lists Documents
listsDocs.forEach(
(DocumentSnapshot listDoc) async {
print(listDoc.metadata.isFromCache ? "listDoc NOT FROM
NETWORK" : "listDoc FROM NETWORK");
listItemsStream(listDoc.documentID);
}
)
}
})
}
listItemsStream(lid){
shoppingItemsRef = Firestore.instance.collection('lists').document(lid).collection('items');
shoppingItemsRef.snapshots().listen(
(QuerySnapshot itemsQuery) async {
List<DocumentSnapshot> itemsDocs = itemsQuery.documents;
if (itemsDocs.length != 0) {
itemsDocs.forEach(
(DocumentSnapshot itemDoc) async {
print(itemDoc.metadata.isFromCache ? "itemDoc NOT FROM
NETWORK" : "itemDoc FROM NETWORK");
}
)
}
}
Provider中的那两个方法,我在Home.dart中调用main函数initState
@override
void initState() {
Provider.of<ListsProvider>(context, listen: false)
.userListsStream(uid);
}
【问题讨论】:
-
请编辑您的问题以包含产生输出的最少、完整的代码。目前还不清楚你是如何阅读的,这让人很难理解。
-
@FrankvanPuffelen 我添加了一些额外的数据,如果您需要任何其他数据,请告诉我
-
糟糕,没关系...我已经颠倒了我的印刷声明。你是对的,对我来说,它也一直在打印
FROM SERVER。这显然是错误的。让我看看我是否能找到一些关于为什么会发生这种情况的信息。 -
我刚刚了解到
isFromCache的工作方式与我的想法完全不同。我将再进行一些测试,然后写出答案。
标签: firebase flutter google-cloud-firestore