Flutter: изменяемые поля в виджетах без сохранения состояния - PullRequest
0 голосов
/ 07 ноября 2018

Класс StatelessWidget помечен как immutable. Однако я использую scoped model, что означает, что я избегаю StatefulWidget и использую model для изменения state в StatelessWidget. Это приводит к тому, что у меня non-final fields в StatelessWidget, что не вызывает errors, потому что это просто warning. Но мне было интересно, есть ли лучший способ?

1 Ответ

0 голосов
/ 07 ноября 2018

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

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

Нет причин избегать StatefulWidget. Это фундаментальный строительный блок Flutter.

На самом деле, ScopedModelDescendant также является виджетом с состоянием. Основное преимущество scoped_model заключается в том, что вы можете отделить бизнес-логику от слоя виджета. Это не устраняет необходимость в виджетах с состоянием.

Используйте виджеты с отслеживанием состояния для:

  • Внедрение моделей с областями видимости в дерево (виджет, который создает виджет ScopedModel). Сохраните экземпляр Model в State.
  • Сохранение пользовательского ввода (TextEditingController, состояние флажка)
  • Анимированные виджеты, для которых требуется AnimationController s
  • Для хранения всего, что заканчивается Controller (TabController, ScrollController, ...)

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

...