Flutter: изменяемые поля в виджетах без сохранения состояния
Класс StatelessWidget
помечен как immutable
, Тем не менее, я использую scoped model
, а это значит, что я избегаю StatefulWidget
и использовать model
изменить state
в StatelessWidget
, Это приводит меня к non-final fields
в StatelessWidget
что не вызывает errors
потому что это просто warning
, Но я задавался вопросом, есть ли лучший способ?
1 ответ
Виджеты без состояния должны иметь только конечные поля, без исключений. Причина: когда родительский виджет по какой-то причине перестраивается (поворот экрана, анимация, прокрутка...), build
вызывается метод родителя, который приводит к реконструкции всех виджетов.
Классы расширяют StatefulWidget
должны следовать тому же правилу, потому что они также реконструированы. Только State
, который может содержать изменяемые поля, сохраняется в течение времени жизни виджета в дереве макета.
Нет причин избегать StatefulWidget
, Это основной строительный блок Флаттера.
По факту, ScopedModelDescendant
также виджет с состоянием. Основное преимущество scoped_model заключается в том, что вы можете отделить бизнес-логику от слоя виджета. Это не устраняет необходимость в виджетах с состоянием.
Используйте виджеты с отслеживанием состояния для:
- Внедрение моделей с областями видимости в дерево (виджет, который создает
ScopedModel
виджет). ХранитьModel
экземпляр вState
, - Хранение пользовательского ввода (
TextEditingController
, состояние флажка) - Анимированные виджеты, которые требуют
AnimationController
s - Хранить все, что заканчивается
Controller
(TabController
,ScrollController
...)
Часто хорошей идеей является создание виджетов "страницы" (виджетов, которые создают Scaffold
, доступны с помощью Navigator
с состоянием Часто это хосты для моделей с ограниченным диапазоном.
Вот вам вопрос:
Как вы думаете, есть ли лучший подход для выполнения того, что я хочу, сохраняя при этом "короткую структуру классов", которая помогает мне контролировать и иметь возможность запускать перестройку этих классов из любого места?
То, о чем вы здесь просите ↑, похоже, является еще одним подходом к управлению состоянием приложения, который должен быть лучше, чем модель с ограниченным объемом.
Как вы знаете, подходы к управлению состоянием приложения - это набор методов, которые позволяют вам как разработчику:
- для привязки данных к виджетам.
Связывание данных с виджетами, в свою очередь, помогает вам как разработчику:
- для автоматического восстановления виджетов при каждом изменении связанных данных.
Возможно, для этой цели вы можете использовать rxdart:
Здесь вы найдете очень полезный список подходов к управлению состоянием приложения, которые могут привести вас к лучшему способу разработки приложения: