Выбор ответа Junior Жизненный цикл спрашивают часто обновлено

Flutter: setState после await

Вопрос

Пользователь ушёл с экрана, пока шёл запрос. Что случится в этом коде и как исправить?

Future<void> _load() async {
  final data = await api.fetch();
  setState(() => _data = data);
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: setState после dispose бросит ошибку; после await нужна проверка mounted. После await State может быть уже удалён.

Варианты ответа

  1. Ничего страшного: setState после dispose просто игнорируется фреймворком
  2. Экран автоматически вернётся на передний план, чтобы показать пришедшие данные
  3. setState после dispose бросит ошибку; после await нужна проверка mountedправильный ответ
  4. Запрос автоматически отменится при уходе с экрана, и до setState дело не дойдёт

Разбор

После await State может быть уже удалён. Вызов setState у такого State бросает «setState() called after dispose()» (в debug это ассерт). Проверка mounted после каждого await обязательна. Сам запрос никто не отменяет: если нужно экономить трафик, его отменяют явно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.