Firebase всегда читает из интернета - PullRequest
1 голос
/ 07 января 2020

Как я знаю, Firebase на Flutter сначала будет автоматически читать из кэша, но во время разработки я заметил, что приложение просто проигрывает почти 1 поток, имеющий 10 или 15 документов, которые я достиг, читает более 4000 операций чтения! Таким образом, если 10 пользователей использовали мое приложение, я заплачу все, что у меня есть, поэтому я должен перепроверить каждый запрос, снимок и поставить этот код, чтобы узнать

print(itemDoc.metadata.isFromCache ? "itemDoc NOT FROM NETWORK" : "itemDoc FROM NETWORK");

Изменить, написать код и многое другое объяснить

Я заметил, что эта проблема появляется в IOS, когда я обновляю, добавляю, удаляю консоль документов, печатаю все сохраненные документы.

У меня есть Основной поток, в котором я получаю все списки пользователей. каждый список, который я создаю, для прослушивания элементов списка

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 initState

 @override
  void initState() {
    Provider.of<ListsProvider>(context, listen: false)
        .userListsStream(uid);
  }

1 Ответ

3 голосов
/ 08 января 2020

Флаг isFromCache указывает, гарантированно ли документ обновлен на сервере, или это может быть устаревший результат из кэша. Если это false, это не обязательно означает, что документ был прочитан с сервера, но вы можете быть уверены, что документ обновлен на сервере.

Чтобы показать, что это значит, я могу этот фрагмент

var snapshotsStream = Firestore.instance.collection("chat").orderBy("timestamp", descending: true).limit(3).snapshots();
snapshotsStream.listen((querySnapshot) {
  print("We got a new QuerySnapshot");
  querySnapshot.documents.forEach((doc) {
    print(doc.documentID+": "+(doc.metadata.isFromCache ? "from CACHE " : "from SERVER "));
  });
  querySnapshot.documentChanges.forEach((docChange) {
    print(docChange.type.toString()+(docChange.document.metadata.isFromCache ? "doc from CACHE " : "doc from SERVER "));
  });
}, onError: (error) {
  print(error);
});

Первоначально я получаю вывод:

флаттер: мы получили новый QuerySnapshot

флаттер: 5nAr5pYgwXJ0n3pWZkLw: от SERVER

флаттер: moysGY7Ea7TCf28fcEV C: от сервера SERVER

флаттер: PuNnPaiLMIE7704R9NuL: от сервера SERVER

флаттер: 5nAr5pYgwXJ0n3pWZJ0n3pWZFLWYDFFF * * * * C: DocumentChangeType.addeddo c от SERVER

флаттер: PuNnPaiLMIE7704R9NuL: DocumentChangeType.addeddo c от SERVER

Затем, когда я изменяю сервер, он печатает:

флаттер: мы получили новый QuerySnapshot

флаттер: 5nAr5pYgwXJ0n3pWZkLw: от SERVER

флаттер: moysGY7Ea7TCf28fcEV C от: ERVER

флаттер: PuNnPaiLMIE7704R9NuL: от СЕРВЕРА

флаттер: 5nAr5pYgwXJ0n3pWZkLw: DocumentChangeType.modifieddo c от СЕРВЕРА

isFromCache означает, что свойство не равно 1038 *

, а значит *, значит, свойство *1038* * 1040 не равно чтобы определить, был ли документ считан для чтения на сервере, но гарантированно ли документ обновлен на сервере.

Чтобы узнать, какие документы были изменены, вы можете выполнить итерацию по коллекции documentChanged , как показано в приведенном выше коде.


Что касается чтения больше, чем вы ожидали, одной из наиболее распространенных причин этого является сохранение панели Firestore открытой в консоли Firebase. Чтения, выполняемые консолью, оплачиваются для вашего проекта. Подробнее об этом см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...