离线时如何停止/销毁Timer?Flutter定时器在线触发需求
离线时停止Timer的实现方案
看了你的代码,目前在线状态下会创建四个定时Timer,但离线时没有处理已启动的Timer,所以需要在网络状态切换到离线时,主动取消所有正在运行的Timer,同时还要避免重复创建或取消导致的异常。
修改后的connectionChanged方法
void connectionChanged(dynamic hasConnection) { setState(() { isOffline = !hasConnection; if(!isOffline){ // 在线前先取消旧Timer,防止重复创建多个实例 timer1?.cancel(); timer1 = Timer.periodic(Duration(seconds: 1), (Timer t) { checkRefresh(); checkQuick(_url, tokens); }); timer3?.cancel(); timer3 = Timer.periodic(Duration(seconds: 5), (Timer t) { globals.getQuick().then((onValue) { setState(() { isQuick = onValue; }); }); }); timer?.cancel(); timer = Timer.periodic(Duration(seconds: 10), (Timer t) { submitRequestSave(_url, tokens); }); timer2?.cancel(); timer2 = Timer.periodic(Duration(seconds: 10), (Timer t) { storeSync(_url, tokens); }); } else { // 离线时取消所有Timer并置空,避免后续误操作 timer1?.cancel(); timer2?.cancel(); timer3?.cancel(); timer?.cancel(); timer1 = null; timer2 = null; timer3 = null; timer = null; } }); }
关键细节说明
- 使用
?.安全调用cancel():如果Timer对象是null(比如还没创建或者已经被取消),不会抛出异常,避免崩溃。 - 在线时先取消旧Timer:如果网络状态频繁切换(比如短时间内多次在线/离线),这样可以防止创建多个重复的Timer,导致定时任务被执行多次。
- 离线时置空Timer对象:明确标记Timer已被清理,下次在线创建时不会和旧实例混淆。
优化dispose方法
同样给你的dispose方法加上?.,确保即使Timer为null也不会报错:
@override void dispose() { timer1?.cancel(); timer2?.cancel(); timer3?.cancel(); timer?.cancel(); super.dispose(); }
这样修改后,网络切换到离线时所有Timer会立即停止工作,重新在线时会重启定时任务,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user9139407
相关产品推荐
相关产品推荐

