Выбор ответа Junior Жизненный цикл спрашивают часто обновлено
Flutter: setState после await
Вопрос
Пользователь ушёл с экрана, пока шёл запрос. Что случится в этом коде и как исправить?
Future<void> _load() async {
final data = await api.fetch();
setState(() => _data = data);
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: setState после dispose бросит ошибку; после await нужна проверка mounted. После await State может быть уже удалён.
Варианты ответа
- Ничего страшного:
setStateпослеdisposeпросто игнорируется фреймворком - Экран автоматически вернётся на передний план, чтобы показать пришедшие данные
setStateпослеdisposeбросит ошибку; послеawaitнужна проверкаmountedправильный ответ- Запрос автоматически отменится при уходе с экрана, и до
setStateдело не дойдёт
Разбор
После await State может быть уже удалён. Вызов setState у такого State бросает «setState() called after dispose()» (в debug это ассерт). Проверка mounted после каждого await обязательна. Сам запрос никто не отменяет: если нужно экономить трафик, его отменяют явно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.