Ошибка «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
