计时器不停止



问题

我在聊天。如果没有消息,我希望程序每5秒再次尝试获取消息。

我的解决方案

我在有状态的小部件中创建了一个定时器。

Timer timer;

当我构建一个小部件时,我会检查消息。如果没有,我启动计时器。我希望计时器在下一次检查时停止,以防出现现有消息

void onBuild() {
if (state.messages.isEmpty) {
_checkEmptyMessages();
timer = Timer.periodic(
Duration(seconds: 5), (Timer t) => _checkEmptyMessages());
}
}

void _checkEmptyMessages() {
print('MES789 ${state.messages.isEmpty}');
if (state.messages.isEmpty) {
add(ChatEventLoadFirstPage()); // This adds an event to the BLoC
} else {
if (timer != null) timer.cancel();
timer = null;
}
}

我也试过

我已经尝试删除timer = null;等待用于timer.cancel();,但没有帮助。

实际输出

所以在调试控制台中,我每5秒钟就会得到一次:

I/flutter(13387):MES789错误

I/flutter(13387):MES789错误

I/flutter(13387):MES789错误

I/flutter(13387):MES789错误

问题

如何停止计时器?

因为调用了"Timer.periodical",所以会创建新的Timer实例并存储相同的定时器变量

这意味着当调用"timer.periodical"时,未取消的计时器的实例将丢失

所以您需要检查Timer实例是否存在

void onBuild() {
if (state.messages.isEmpty) {
if (timer == null) {
timer = Timer.periodic(
Duration(seconds: 5), (Timer t) => add(ChatEventLoadFirstPage()));
}
}  else {
if (timer != null) timer.cancel();
timer = null;
}
}

此代码是死代码,它永远不会工作,因为您再次在_checkEmptyMessages()if (state.messages.isEmpty)之前有if (state.messages.isEmpty),请尝试删除第一个if (state.messages.isEmpty)

最新更新