#firebase #flutter #google-cloud-firestore
#firebase #флаттер #google-облако-firestore
Вопрос:
Flutter позволяет очень легко прослушивать изменения документа в режиме реального времени через StreamBuilder
виджет. Я пытаюсь подсчитать, как часто документ загружается на клиент, но я не могу этого сделать, когда я использую a StreamBuilder
, поскольку он не предлагает эту функциональность. Я пытался обмануть, увеличив счетчик в функции сборки, но до тех пор, пока что-то на экране меняется, это увеличивает счетчик, даже если изменений в документе нет.
Есть ли способ подсчитать количество загрузок документов?
Заранее большое спасибо.
Комментарии:
1. Просто предположение… можете ли вы достичь этого с помощью облачных функций Firebase?
2. Я не понимаю, что вы хотите точно посчитать. Вы хотите подсчитать количество вызовов API для определенного документа глобально или локально?
3. @MatthewTrent да, это возможно, но было бы слишком сложно отслеживать чтения, увеличивая счетчик с помощью записи. Я хотел бы сделать это на стороне клиента.
4. @CrimsonFoot Я хотел бы подсчитать количество операций чтения документа при каждой загрузке документа. A
StreamBuilder
считывает изменения, которые также считаются операциями чтения. Таким образом, я надеюсь отслеживать использование для каждогоgroup
,tag
, или любого другого объекта, с которым я это связываю. Другими словами, я хотел бы сделать некоторые расчеты для определенных затрат.5. @Albert Кажется, вам нужна какая-то аналитика. Почему бы вам не обратиться к этой документации? firebase.google.com/docs/functions/writing-and-viewing-logs
Ответ №1:
Я не знаю, возможно ли быть точным в подсчете использования API Firestore. Но вы можете скрыть свой поток моментальных снимков за BehaviorSubject
from rxdart
, чтобы при перестроении StreamBuilders
использовалось значение, сохраненное BehaviorSubject
в, не касаясь snapshot
. Затем вы можете использовать метод doOnData
на snapshot
.
final Stream<QuerySnapshot<Map<String, dynamic>>> _firestoreSnapshots =
FirebaseFirestore.instance
.collection("myCollection")
.snapshots()
.doOnData((event) {
print(event);
});
/// Wrapper around the Firestore snapshot, to be able to
/// remember the latest value and subscribe multiple times.
BehaviorSubject<QuerySnapshot<Map<String, dynamic>>>
behaviorFirestoreCollection = BehaviorSubject();
FirestoreRepository() {
// Expose the snapshot on the behavior subject
behaviorFirestoreCollection.addStream(_firestoreSnapshots);
}
Вы StreamBuilder
подпишетесь на тему поведения. При перестроении StreamBuilder
(по причинам, отличным от нового переданного значения), print
не произойдет.
Будет ли это работать без субъекта поведения, я не уверен. Вы могли бы попробовать это сначала.
Комментарии:
1. Привет, спасибо за ваш ответ. Флаттер говорит, что
snapshots()
у него нетdoOnData
метода :/2. Привет, извините, я должен был упомянуть, что вы получаете этот метод из
rxdart
пакета. Этоextension
значение onStream
, заданное пакетом.3. У меня возникли некоторые проблемы с реализацией этого. Не могли бы вы предоставить какой-нибудь пример реализации?
4. Если вы поделитесь своей попыткой на GitHub, я могу посмотреть и сделать PR.