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, состояние флажка)
  • Анимированные виджеты, которые требуют AnimationControllers
  • Хранить все, что заканчивается Controller (TabController, ScrollController...)

Часто хорошей идеей является создание виджетов "страницы" (виджетов, которые создают Scaffold, доступны с помощью Navigatorс состоянием Часто это хосты для моделей с ограниченным диапазоном.

Вот вам вопрос:

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

То, о чем вы здесь просите ↑, похоже, является еще одним подходом к управлению состоянием приложения, который должен быть лучше, чем модель с ограниченным объемом.

Как вы знаете, подходы к управлению состоянием приложения - это набор методов, которые позволяют вам как разработчику:

  • для привязки данных к виджетам.

Связывание данных с виджетами, в свою очередь, помогает вам как разработчику:

  • для автоматического восстановления виджетов при каждом изменении связанных данных.

Возможно, для этой цели вы можете использовать rxdart:

Здесь вы найдете очень полезный список подходов к управлению состоянием приложения, которые могут привести вас к лучшему способу разработки приложения:

Другие вопросы по тегам