我在我的一个有状态小部件中创建了一个函数,我定期调用它,所以一旦我退出屏幕,该函数仍然会被调用。我定期调用一个API,当调用出错时,我会显示一个snackbar,所以有时当我退出应用程序时,snakbar会继续出现。
@override
void initState() {
super.initState();
loadMessages();
}
@override
void dispose() {
super.dispose();
}
Future<void> loadMessages() async {
Map<String, dynamic> data = await chatVM.fetchConvoApi();
List<dynamic> messagesJson = data['messages'];
setState(() {
if (messagesJson.isEmpty == false) {
_messages = messagesJson.map((e) => Message.fromJson(e)).toList();
}
startLoadingNewMessagesPeriodically();
});
}
Future<void> loadNewMessages() async {
String? time;
if (_messages.isNotEmpty) {
time = _messages[_messages.length - 1].sentTime;
}
Map<String, dynamic> data =
await chatVM.fetchLatestApi(time ?? DateTime.now().toIso8601String());
List<dynamic> messagesJson = data['messages'];
if (messagesJson.isNotEmpty) {
setState(() {
_messages.addAll(messagesJson.map((e) => Message.fromJson(e)).toList());
});
}
}
void startLoadingNewMessagesPeriodically() {
Timer.periodic(const Duration(seconds: 5), (timer) {
// Your code to load new messages here
loadNewMessages();
});
}
1条答案
按热度按时间gv8xihay1#
听了你的解释,我有点难以理解发生了什么事。你能给予我更多的信息吗?
我认为有两种可能的情况
1.您的Stateful小部件仍在小部件树中。
从技术上讲,如果小部件树中没有Stateful Wiget,它就不会调用任何函数。所以我建议你在Devtools中检查你的Widget树。如果它仍然在你的小部件树中,确保它从你的小部件树中卸载。
1.检查状态Widget的
dispose()
方法。您是否在
State
Widget的dispose()
方法上添加了任何新方法?在这种情况下,调用dispose()
时可能会产生某种副作用。