问题
我在聊天。如果没有消息,我希望程序每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)