Я использую шаблон блока, как описано в 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();
}
}
Я хочу уменьшить количество ненужных операций записи и чтения, которые будут стоить мне целое состояние, если приложение будет продолжать делать запросы на чтение / запись так часто.Спасибо за помощь.