#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(() {
});
});