Прослушивание изменений документа firestore внутри streambuilder

#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 значение on Stream , заданное пакетом.

3. У меня возникли некоторые проблемы с реализацией этого. Не могли бы вы предоставить какой-нибудь пример реализации?

4. Если вы поделитесь своей попыткой на GitHub, я могу посмотреть и сделать PR.