You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

离线时如何停止/销毁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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:43:46