Возвращает ли Stream ‹List ‹Object›› из моментального снимка Firebase весь узел при каждом изменении узла? Флаттер

Я начинаю изучать Flutter, так как хочу перенести свое приложение iOS на Flutter, чтобы оно работало и на Android. Я использую базу данных Firebase в реальном времени для серверной части, и я увидел, что пакет firebase_database должен соответствовать моим потребностям, позволяя мне использовать уже имеющуюся базу данных. Я также учусь использовать шаблон BLoC, но все блочные руководства, которые я нашел, предназначены для Firestore, и все Event / State / Bloc / Repository / Streaming все еще меня сбивают с толку прямо сейчас. Какой должна быть правильная реализация блочного рисунка?

На базовом уровне я понимаю это, и мне это очень нравится, но думать о том, как реализовать это для моих нужд, получается немного ошеломляющим.

Следуя этой диаграмме, поток данных с 6 подключениями должен выглядеть следующим образом:  введите описание изображения здесь

  1. (UI -> BLoC) Событие будет отправлено на bloc.
  2. (BLoC -> Репозиторий) Bloc отображает событие на метод Repository.
  3. (Репозиторий -> База данных) Repository методы - это методы создания / обновления / удаления базы данных.
  4. (База данных -> Репозиторий) Метод Repository чтения из базы данных получает Данные из базы данных.
  5. (Репозиторий -> BLoC) Метод чтения Repository базы данных возвращает данные в BLoC.
  6. (BLoC -> UI) BlocProvider использует данные для восстановления пользовательского интерфейса.

Я не уверен, что понял, что данные возвращаются в пользовательский интерфейс.

На шаге 2, если я сопоставляю событие с методом, который возвращает данные как Stream<List<Object>>, то через BlocProvider на шаге 6 UI (виджет без сохранения состояния) соответствующим образом перестраивается. Теперь, как я понимаю, это было бы много ненужных повторяющихся загрузок данных, если бы при каких-либо изменениях загружался весь узел, а также Google выставлял вам счет за загрузки.

В Firebase iOS SDK вы можете прикреплять наблюдателей к узлу, поэтому вы просто получаете снимок с _14 _ / _ 15_etc и т. Д. И используете его для изменения своего пользовательского интерфейса.

Чтобы избежать бесполезных загрузок и сохранить свою учетную запись в безопасности, я бы предпочел сделать запрос на узле с параметром keepSynced bool, установленным в значение true (https://pub.dev/documentation/firebase_database/latest/firebase_database/Query-class.html). Это должно (как iOS SDK) вернуть при первом запуске снимок со всем узлом, а затем снимки только с новым / обновленным / удаленным, когда что-то изменится, верно?

Вместо этого, чтобы реализовать этот способ, следует ли мне использовать List<Object>, который я обновляю вручную при получении снимка, и виджет с отслеживанием состояния? Именно так сейчас работает мое приложение для iOS. Большое спасибо за помощь и извините за длинный вопрос, переход со Swift требует времени.


person Vincenzo    schedule 23.02.2020    source источник


Ответы (1)


Слушатели Firebase передают только минимальный объем данных, которые фактически изменились на прослушиваемом узле. Он НЕ передает весь узел и всех его дочерних элементов каждый раз, когда что-либо изменяется. Так что это не так дорого, как вы себе представляете.

person Doug Stevenson    schedule 23.02.2020
comment
слушатель не возвращает весь узел? Если нет, то как тогда можно вернуть Stream<List<Object>>? Список - это весь узел, верно? И мои 6 шагов верны? - person Vincenzo; 24.02.2020
comment
В первый раз вы получите весь узел и только дельты с этого момента, пока слушатель все еще прикреплен. - person Doug Stevenson; 24.02.2020
comment
О, я вижу. чем то же самое, что и наблюдатели в iOS SDK .. мило .. так что, я думаю, я понял шаблон блока. Ваше здоровье. - person Vincenzo; 24.02.2020
comment
Все клиентские SDK работают одинаково. Фактически, именно серверная сторона определяет, что отправлять клиентам, учитывая местоположение или запрос, который клиент просит прослушать. - person Doug Stevenson; 24.02.2020
comment
Конечно, все SDK работают одинаково, просто информация и руководства, которые я нашел, предназначены для Firestore, и я никогда их не использовал. В одном (udemy) при загрузке сообщений из Firestore моментальный снимок содержал все сообщения каждый раз .. так что я забеспокоился. - person Vincenzo; 24.02.2020
comment
Это похоже на RTDB и Firestore, за исключением того, что Firestore отправляет целые документы, если что-либо в документе изменяется (а не отдельные поля). - person Doug Stevenson; 24.02.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Vincenzo; 24.02.2020