Это поток из снимка Firebase, возвращающего весь узел при каждом изменении в узле? флаттер - PullRequest
0 голосов
/ 24 февраля 2020

Я начинаю изучать Flutter, поскольку хочу перенести свое приложение iOS на Flutter, чтобы оно также работало на Android. Я использую базу данных Firebase в реальном времени для серверной части и увидел, что пакет firebase_database должен соответствовать моим потребностям, позволяя мне использовать уже имеющуюся базу данных. Я также учусь использовать шаблон BLo C, но все учебные пособия по blo c, которые я нашел, предназначены для Firestore, и все события / состояния / блоки / репозитории / потоковые данные по-прежнему меня сильно смущают. Какой должна быть правильная реализация шаблона blo c?

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

Следуя этой схеме, поток данных 6 соединений должен быть: enter image description here

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

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

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

В Firebase iOS SDK вы можете прикрепите наблюдателей к узлу, так что вы просто получите снимок с .childAdded / .childRomoved et c et c и используйте его для изменения вашего пользовательского интерфейса.

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

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

1 Ответ

2 голосов
/ 24 февраля 2020

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

...