Передача данных Firebase Cloud Messaging на n экранов над текущим экраном и через приложение во Flutter
У меня во Флаттере есть приложение, которое вытягивает много данных на родительском экране. Родительский экран делится на несколько дочерних экранов, а те переходят на несколько дочерних экранов.
Теперь, чтобы убедиться, что данные не извлекаются из API все время, я просто вытягиваю их один раз в корневой экран, что вполне нормально в 90% случаев.
Все последующие обновления транслируются по всему приложению через облачные сообщения Firebase.
Если я на экране 3, мне нужно обновить данные на экране 1, которые также должны обновить данные, которые в конечном итоге будут отображаться на экране 2. В настоящее время я использую этот метод для передачи своих данных ( https://flutter.io / кулинарная книга / навигация / передача данных /)
Например, экран 1 содержит три проекта. У каждого проекта есть свой экран.
Экран 2.1 для проекта 1, экран 2.2 для проекта 2 и так далее.
На экране 2.1 есть n списков дел.
Теперь, если я открою список дел, я попаду на экран 3 с данными первого списка дел проекта 1.
В уведомлении о передаче данных облачной базы Firebase я получаю новую информацию из этого списка задач и что-то из списка задач проекта 2 в списке задач 1.
Как мне поддерживать согласованность и обновлять данные по всем направлениям?
Нужно ли мне менять архитектуру и использовать Redux или что-то в этом роде?
2 ответа
Очень хороший вопрос!
Вам понадобится центральная "служба данных", которая действует как единый источник правды.
Он загружает исходные данные и сохраняет их в нем, а также обновляет данные при поступлении облачного сообщения и уведомляет все виджеты, которые зависят от данных, которые изменились.
На экранах никогда не хранится изменяемая копия данных, вместо этого они запрашивают службу данных, чтобы получить самые последние данные.
В зависимости от сложности вашего приложения, существуют разные решения, которые работают с потоками или без них.
InheritedWidget
является основным решением, с которым поставляется Flutter. Вы бы обычно имели StatefulWidget
с State
это окутывает тебя MaterialApp
с InheritedWidget
транслировать State
на ваши экраны.
scoped_model - это тонкая оболочка вокруг InheritedWidget
, но в основном предлагает ту же функцию. Опять же, поставщик модели должен обернуть MaterialApp
сделать его доступным на всех экранах.
BLoC and flutter_redux are more advanced solutions.
Этот вопрос на самом деле связан с поддержанием состояния в приложении. Флаттер поддерживает различные методы для поддержания состояния. Это зависит от того, что вы строите.
Унаследованный виджет: это самый простой способ, но у него есть недостатки, когда состояние должно поддерживаться в дереве виджетов.
Модель Scoped: Этот пакет полезен для поддержания состояния его потомков.
Потоки (BLoC): это лучший способ поддерживать состояние в приложении. Flutter использует аналогичный процесс для поддержания состояния в дереве виджетов приложения. В трепетании все по сути является потоком.
Больше ресурсов для реализации BLoC. Реализация Flutter Show BloC Pattern