Какие основные типы состояний есть во Flutter
Что проверяют
Знаете ли вы, как Flutter перерисовывает интерфейс и где должно жить состояние. Слова Provider и Bloc интервьюер слышит часто, поэтому следом спросят, почему вы выбрали бы то или иное решение и что происходит при вызове setState.
Как отвечать
В документации Flutter состояние делится на два вида, с них и начните:
- эфемерное (локальное): нужно одному виджету и не переживает уход с экрана. Текущая вкладка, прогресс анимации, раскрыт ли блок. Хранится в
StateуStatefulWidgetи меняется черезsetState, который помечает виджет грязным, и на следующем кадре вызываетсяbuild; - состояние приложения: нужно многим экранам или должно пережить навигацию. Авторизация, корзина, настройки, кэш данных.
Дальше инструменты для второго вида:
InheritedWidget: базовый механизм, по которому данные спускаются по дереву. На нём построенprovider, через него же работаютTheme.of(context)иMediaQuery.of(context);ChangeNotifierиValueNotifier: наблюдаемые объекты из самого фреймворка, их слушают черезListenableBuilderиValueListenableBuilder;- пакеты:
provider, Riverpod (не зависит отBuildContextи не падает в рантайме с «провайдер не найден»), Bloc и Cubit (состояние как поток, изменения через события или методы).
Асинхронные данные показывают через FutureBuilder и StreamBuilder: они отдают загрузку, данные и ошибку через AsyncSnapshot.
Если спросят про жизненный цикл State, назовите initState, didChangeDependencies, build, didUpdateWidget и dispose, где освобождают контроллеры и подписки.
Где спотыкаются
Выдают способы управления за типы состояния. «Потоковое» и «событийное» состояние это подходы к хранению, а не отдельные виды, и такое деление выдаёт заученный текст.
Создают Future прямо в build и передают в FutureBuilder. Каждая перерисовка запускает запрос заново, поэтому Future создают в initState и хранят в поле.
Вызывают setState после await без проверки mounted. Если пользователь успел уйти с экрана, получите ошибку setState() called after dispose().