Как исправить данные чтения / записи в Firestore непрерывно, даже если не были запущены операции записи / чтения - PullRequest
1 голос
/ 22 апреля 2019

Я использую шаблон блока, как описано в https://github.com/boeledi/blocs для моего приложения.В приложении я в основном выбираю и записываю данные в и из пожарного магазина.Недавно я заметил, что мои 20 000 бесплатных записей в FireStore довольно быстро заканчиваются, когда я тестирую приложение с очень небольшим количеством запросов на запись.После мониторинга я обнаружил, что мое приложение непрерывно записывает / читает данные из и в хранилище (хотя я не вижу новых данных, которые записываются.).Я наблюдал за консолью моего приложения Firestore в течение часа, не делая никаких запросов на чтение / запись, и был поражен, увидев, что запросы выполняются довольно часто, что приводит к потере моей 20-килобайтной квоты на запись примерно за пару часов.

До сих пор я пытался выяснить, почему запросы выполняются постоянно, но я не могу понять, почему это может происходить.После поиска в интернете я не нашел каких-либо конкретных ответов на этот вопрос, поэтому я почти уверен, что именно из-за ошибки нуба я совершил ошибку, тем более что я впервые работаю с firestore и flutter.

Readоперации:

populateItemList(){
    _db.collection('users').document(merchant.uid).collection('items').getDocuments().then(
        (docs){
          docs.documents.forEach(
              (doc){
                ItemDetails item = ItemDetails(doc.data["ItemName"], doc.data["ItemPrice"], doc.data["ItemQty"], doc.data["ItemUnit"]);
                listItems.add(item);
                itemNameList.add(item.itemName);
              }

          );
          listIn.add(listItems); // Sink<List<ItemDetails>>
          itemNameListIn.add(itemNameList); // Sink<List<String>>
        }
    );
  }

Операции записи:

setItemData(FirebaseUser user, String itemName, double itemQty, double itemPrice, String itemUnit) async{
    var ref = _db.collection('users').document(user.uid).collection('items').document(itemName.toUpperCase());
    Map<String, dynamic> mapToUpdate ={};
    mapToUpdate = {"ItemName" : itemName.toUpperCase(), "ItemQty" : itemQty, "ItemPrice" : itemPrice, "ItemUnit" : itemUnit};
    await ref.setData(mapToUpdate, merge: true);
  }

Чтобы вызвать операцию записи, я слушаю поток, который в основном проверяет, относятся ли данные, предоставленные в текстовых полях, к itemFieldявляется действительным.Как только он будет считаться действительным, RaisedButton станет активным и отправит событие для обновления информации.

StreamBuilder<bool>(
            stream: _ItemUpdateFormBloc.registerValid,
            builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
              return RaisedButton(
                child: Text('Proceed'),
                onPressed: (snapshot.hasData && snapshot.data == true)
                    ? () {
                  _itemUpdateBloc.emitEvent(ItemUpdateEvent(
                      user: widget.user,
                      event: ItemUpdateEventType.working,
                      itemUnit: _itemUnitController.text,
                      itemPrice: double.parse(_itemPriceController.text.toString()),
                      itemQty: double.parse(_itemQtyController.text.toString()),
                      itemName: _itemNameController.text,)
                  );
                }
                    : null,
              );
            }
        )

После получения события обработчик события сделает следующее:

Stream<ItemUpdateState> eventHandler(ItemUpdateEvent event, ItemUpdateState currentState) async* {
    if (event.event == ItemUpdateEventType.working){
      yield ItemUpdateState.busy();
      itemService = ItemService(event.user);
      await itemService.setItemDataAndGetInfo(event.user, event.itemName, event.itemQty, event.itemPrice, event.itemUnit);
      yield ItemUpdateState.success();
    }
  }

Я хочу уменьшить количество ненужных операций записи и чтения, которые будут стоить мне целое состояние, если приложение будет продолжать делать запросы на чтение / запись так часто.Спасибо за помощь.

...