Я начинаю изучать Flutter, поскольку хочу перенести свое приложение iOS на Flutter, чтобы оно также работало на Android. Я использую базу данных Firebase в реальном времени для серверной части и увидел, что пакет firebase_database
должен соответствовать моим потребностям, позволяя мне использовать уже имеющуюся базу данных. Я также учусь использовать шаблон BLo C, но все учебные пособия по blo c, которые я нашел, предназначены для Firestore
, и все события / состояния / блоки / репозитории / потоковые данные по-прежнему меня сильно смущают. Какой должна быть правильная реализация шаблона blo c?
До базового c уровня я это понимаю и мне это очень нравится, но думать о том, как реализовать его для своих нужд, в результате получается немного подавляющим.
Следуя этой схеме, поток данных 6 соединений должен быть: ![enter image description here](https://i.stack.imgur.com/H9kbu.png)
- (UI -> BLo C) An Событие будет отправлено на
bloc
. - (BLo C -> Репозиторий)
Bloc
отображает событие в метод Repository
. - (Репозиторий -> База данных) Методы
Repository
- это методы создания / обновления / удаления базы данных. - (База данных -> Репозиторий) Метод чтения базы данных
Repository
получает данные базы данных. - (Репозиторий -> BLo C) Метод чтения базы данных
Repository
возвращает данные в BLo C. - (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 занимает время.