Вступить в клуб →
средняявопросПлатформы и жизненный цикл приложения

Ошибка «setState() called after dispose» при быстром уходе с экрана

Экран новостей во Flutter:

class _NewsPageState extends State<NewsPage> {
  List<Article> items = [];

  @override
  void initState() {
    super.initState();
    api.loadArticles().then((data) {
      setState(() => items = data);
    });
  }
}

В логах Crashlytics регулярно появляется ошибка про setState после dispose. Воспроизводится, если открыть экран и сразу нажать «назад».

Что здесь происходит и как чинить?

  • Flutter молча игнорирует setState для удалённых виджетов, а ошибка приходит из другого места приложения
  • Проблема в then вместо await: с await ошибка бы не возникла
  • Данные попадут в новый экземпляр экрана при следующем открытии, поэтому ошибка безопасна и её достаточно отфильтровать в настройках системы мониторинга
  • Ответ приходит уже после dispose, и setState вызывается у отсоединённого State — нужно проверять mounted или отменять работу в dispose

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела