Я начинаю изучать Flutter, так как хочу перенести свое приложение iOS на Flutter, чтобы оно работало и на Android. Я использую базу данных Firebase в реальном времени для серверной части, и я увидел, что пакет firebase_database
должен соответствовать моим потребностям, позволяя мне использовать уже имеющуюся базу данных. Я также учусь использовать шаблон BLoC, но все блочные руководства, которые я нашел, предназначены для Firestore
, и все Event / State / Bloc / Repository / Streaming все еще меня сбивают с толку прямо сейчас. Какой должна быть правильная реализация блочного рисунка?
На базовом уровне я понимаю это, и мне это очень нравится, но думать о том, как реализовать это для моих нужд, получается немного ошеломляющим.
Следуя этой диаграмме, поток данных с 6 подключениями должен выглядеть следующим образом:
- (UI -> BLoC) Событие будет отправлено на
bloc
. - (BLoC -> Репозиторий)
Bloc
отображает событие на методRepository
. - (Репозиторий -> База данных)
Repository
методы - это методы создания / обновления / удаления базы данных. - (База данных -> Репозиторий) Метод
Repository
чтения из базы данных получает Данные из базы данных. - (Репозиторий -> BLoC) Метод чтения
Repository
базы данных возвращает данные в BLoC. - (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 требует времени.