в первую очередь: я новичок в stackoverflow и Flutter / декларативных платформах, поэтому, если я просто пропустил поиск правильных тегов, извините меня.
Short
Как я могу добиться достойного управления состоянием для полностью универсального приложения, которое построено из базовых виджетов с нуля во время выполнения?Поскольку взаимодействие также является полным, потенциально все состояния всех элементов могут быть изменены из многих источников.
Long
В настоящее время мы работаем над мобильным клиентом для нашей системы управления приложениями и выбрали Flutter / Dart, поскольку нам не нужно иметь два совершенно разных приложения дляiOS и Android, но теперь мы сталкиваемся с некоторыми трудностями при реализации нашего императивного кода из прежних клиентских приложений (написанных на AS, Objective-C, Java) во Flutter.
Самым важным моментом в нашей системе является то, что вся структура приложения сохраняется в базе данных, которая загружается во время выполнения, а затем анализируется в древовидную структуру данных с отношениями родитель-ребенок.Эта структура данных используется для создания пользовательского интерфейса с нашими основными пользовательскими виджетами (метка, изображение, группа, ...).Таким образом, все приложение полностью универсально.Взаимодействие с приложением также является общим, обычно позволяя в любое время изменять состояние каждого виджета.Состояние элемента может быть изменено несколькими источниками (взаимодействиями, которые обрабатываются глобально, неявно родительским или любым другим элементом со связью состояний для синхронизации состояний).
Например, взаимодействие может быть определено так, чтоувеличивает страницу галереи.Сама галерея представляет собой групповой элемент с тремя дочерними элементами: изображение, метка и прямоугольник в качестве фона.При изменении страницы группы она сообщает своим детям, что страница изменилась, и они, в свою очередь, проверяют все свои настройки (размер, положение, файл, текстовые данные), если они должны быть обновлены.В этом случае настройки файла изображения и настройки текста метки будут обновлены, поэтому два виджета, представляющих эти два элемента, необходимо будет перерисовать, а фон, конечно, не будет.В любом случае имейте в виду, что эта галерея и взаимодействие являются общими, и у меня нет доступа к ним, пока структура данных не была построена во время выполнения.Галерея также может состоять из дополнительной метки, или взаимодействие может изменить состояние другой группы, которая является родительской для галереи.
Текущее решение
Хак, я сделал setState () из WidgetStates доступным для объекта структуры данных элемента.Пока это работает, но мне неудобно работать против декларативного характера фреймворка, и я уверен, что рано или поздно это приведет к ошибкам.
Research
IВы прочитали несколько статей о решениях по управлению состоянием с scoped_model
, BloC
и Redux
, но похоже, что все они работают с каким-то потоком / подпиской, что кажется нереальным, так как для каждого отдельного виджета потребуется несколько потоков.Глобального состояния не существует, каждый элемент имеет свое собственное состояние, но это состояние потенциально должно быть доступно для всех.
Справка
Я был бы рад, если бы кто-то мог показатьПример, в котором реализовано что-то вроде полного доступа к состоянию каждого элемента без хакерского подхода сделать setState () доступным для объекта структуры данных.И, конечно, любые идеи, подсказки или исправления к моим предположениям приветствуются.
Заранее спасибо!