Когда я провожу пальцем, появляется эта ошибка:-Необработанное исключение: setState() вызывается после dispose()

#flutter #dart #flutter-state

Вопрос:

Я подсчитываю количество пролистываний пользователем, и это действительно считается, когда он печатается в консоли, но после пролистывания я получаю эту ошибку:-

   [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: setState() called after dispose(): _HomeState#990d2(lifecycle state: defunct, not mounted, ticker inactive)
  This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback.
  The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
  This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().
 

Функция и куда приводит меня ошибка, я прокомментировал это, и я не уверен, что внесу какие-либо изменения в setState, тогда он не будет вести подсчет или запоминать количество, когда я переключусь на вкладку «Главная», так как я хочу сохранить это в памяти:-

    _getCurrentUser() async {
  User user =  await auth.currentUser;

return docRef

    .doc("${user.uid}")
    .snapshots().listen((data) async {
  currentUser = CreateAccountData.fromDocument(data);
  if (mounted) setState(() {});
  users.clear();
  userRemoved.clear();
  getUserList();
   getLikedByList();
  _getSwipedcount();

  // configurePushNotification(currentUser);
  return currentUser;
});
 }


int swipecount = 0;

_getSwipedcount() {
  FirebaseFirestore.instance.collection('/users/${currentUser.uid}/CheckedUser')
    .where(
      'timestamp',
      isGreaterThan: Timestamp.now().toDate().subtract(Duration(days: 1)),
    )
    .snapshots()
    .listen((event) {
      print("swipe " event.docs.length.toString());
      setState(() {     ///Error takes me here to the setState
        swipecount = event.docs.length;
      });
      return event.docs.length;
    });
}
 

Комментарии:

1. Это происходит из-за того, как ваш родитель обрабатывает этот объект состояния. Я чувствую, что в архитектуре есть ошибка. Опубликуйте свой родительский код виджета, а также код дочернего виджета, который содержит это состояние набора.

2. обновленный. пожалуйста, проверьте сейчас.

3. Где вы вызываете свою _getSwipedcount функцию ?

4. его в _getCurrentUser()

5. что я упускаю или делаю неправильно? Где мне нужно внести изменения?

Ответ №1:

При вызове setState() , если связанный StatefulWidget не смонтирован (т. Е. виден на экране), вы получаете эту ошибку.

Для синхронного кода это обычно не проблема, но с асинхронным кодом вы можете завершить вызов setState после удаления состояния.

Чтобы исправить это, найдите строку, которая выдает ошибку , и убедитесь, что State она смонтирована перед вызовом setState , например:

 if (mounted) {
  setState(() {
    // update UI
});
}
 

Ответ №2:

Добавьте задержку, это решит эту проблему .

   Future.delayed(const Duration(milliseconds: 500), () {
    
      setState(() {
        
      });
    
    });