Виджеты без сохранения состояния должны иметь только конечные поля, с без исключений . Причина: когда родительский виджет по какой-то причине перестраивается (поворот экрана, анимация, прокрутка ...), вызывается метод родительского элемента build
, который приводит к восстановлению всех виджетов.
Классы, расширяющие StatefulWidget
, должны следовать тому же правилу, потому что они также восстанавливаются. Только State
, который может содержать изменяемые поля, сохраняется в течение времени жизни виджета в дереве макета.
Нет причин избегать StatefulWidget
. Это фундаментальный строительный блок Flutter.
На самом деле, ScopedModelDescendant
также является виджетом с состоянием. Основное преимущество scoped_model заключается в том, что вы можете отделить бизнес-логику от слоя виджета. Это не устраняет необходимость в виджетах с состоянием.
Используйте виджеты с отслеживанием состояния для:
- Внедрение моделей с областями видимости в дерево (виджет, который создает виджет
ScopedModel
). Сохраните экземпляр Model
в State
.
- Сохранение пользовательского ввода (
TextEditingController
, состояние флажка)
- Анимированные виджеты, для которых требуется
AnimationController
s
- Для хранения всего, что заканчивается
Controller
(TabController
, ScrollController
, ...)
Часто хорошей идеей является сделать виджеты «страницы» (виджеты, которые создают Scaffold
, доступными с помощью Navigator
) с состоянием. Часто это хосты для моделей с ограниченным диапазоном.