Управление состоянием в универсальном приложении, создаваемом во время выполнения - PullRequest
0 голосов
/ 22 февраля 2019

в первую очередь: я новичок в stackoverflow и Flutter / декларативных платформах, поэтому, если я просто пропустил поиск правильных тегов, извините меня.

Short

Как я могу добиться достойного управления состоянием для полностью универсального приложения, которое построено из базовых виджетов с нуля во время выполнения?Поскольку взаимодействие также является полным, потенциально все состояния всех элементов могут быть изменены из многих источников.

Long

В настоящее время мы работаем над мобильным клиентом для нашей системы управления приложениями и выбрали Flutter / Dart, поскольку нам не нужно иметь два совершенно разных приложения дляiOS и Android, но теперь мы сталкиваемся с некоторыми трудностями при реализации нашего императивного кода из прежних клиентских приложений (написанных на AS, Objective-C, Java) во Flutter.

Самым важным моментом в нашей системе является то, что вся структура приложения сохраняется в базе данных, которая загружается во время выполнения, а затем анализируется в древовидную структуру данных с отношениями родитель-ребенок.Эта структура данных используется для создания пользовательского интерфейса с нашими основными пользовательскими виджетами (метка, изображение, группа, ...).Таким образом, все приложение полностью универсально.Взаимодействие с приложением также является общим, обычно позволяя в любое время изменять состояние каждого виджета.Состояние элемента может быть изменено несколькими источниками (взаимодействиями, которые обрабатываются глобально, неявно родительским или любым другим элементом со связью состояний для синхронизации состояний).

Например, взаимодействие может быть определено так, чтоувеличивает страницу галереи.Сама галерея представляет собой групповой элемент с тремя дочерними элементами: изображение, метка и прямоугольник в качестве фона.При изменении страницы группы она сообщает своим детям, что страница изменилась, и они, в свою очередь, проверяют все свои настройки (размер, положение, файл, текстовые данные), если они должны быть обновлены.В этом случае настройки файла изображения и настройки текста метки будут обновлены, поэтому два виджета, представляющих эти два элемента, необходимо будет перерисовать, а фон, конечно, не будет.В любом случае имейте в виду, что эта галерея и взаимодействие являются общими, и у меня нет доступа к ним, пока структура данных не была построена во время выполнения.Галерея также может состоять из дополнительной метки, или взаимодействие может изменить состояние другой группы, которая является родительской для галереи.

Текущее решение

Хак, я сделал setState () из WidgetStates доступным для объекта структуры данных элемента.Пока это работает, но мне неудобно работать против декларативного характера фреймворка, и я уверен, что рано или поздно это приведет к ошибкам.

Research

IВы прочитали несколько статей о решениях по управлению состоянием с scoped_model, BloC и Redux, но похоже, что все они работают с каким-то потоком / подпиской, что кажется нереальным, так как для каждого отдельного виджета потребуется несколько потоков.Глобального состояния не существует, каждый элемент имеет свое собственное состояние, но это состояние потенциально должно быть доступно для всех.

Справка

Я был бы рад, если бы кто-то мог показатьПример, в котором реализовано что-то вроде полного доступа к состоянию каждого элемента без хакерского подхода сделать setState () доступным для объекта структуры данных.И, конечно, любые идеи, подсказки или исправления к моим предположениям приветствуются.
Заранее спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете захотеть обернуть голову вокруг концепции BloC, которая используется в Dart / Flutter и AFAIK также рекомендуется Google.

Это концепция, в которой вы отделяете свою бизнес-логику от кода пользовательского интерфейса.
В большинстве учебных пособий показано, как правильно интегрировать какой-либо веб-API с BloC, но в вашем случае вместо этого вы предпочитаете подключаться к базе данных.источник.Что должно быть совершенно нормально!

Я бы порекомендовал превосходную библиотеку Феликса Ангелова под названием flutter_bloc и введение / руководство по BloCs в Flutter.Он отлично объясняет систему, рассказывая вам о нескольких примерах.

Руководство можно найти здесь: https://felangel.github.io/bloc/#/gettingstarted

...