在 dart/flutter 中访问和取消周期性计时器

Accessing and cancelling a periodic timer in dart/flutter

我正在使用周期性计时器从服务器获取数据。当 bool (userExpectingTimerBool) 已设置为 false 时,我需要有条件地停止计时器,并且还需要用户明确停止它。停止后,周期定时器 _timer 和最后调度的回调定时器 _t(或 t)都不应该 运行.

我现在有一个完整的工作代码。但是我觉得其中有些是多余的,并且在阅读文档后我对周期性计时器的某些方面仍然不清楚。代码包含在下面。


我有四个问题:

  1. 我是否需要同时停止 _timer_t(或 t)才能停止所有计划任务?
  2. 我应该使用哪个计时器来显示搜索计数 (t.tick/_t.tick/_timer.tick)?
  3. 回调函数是一个瞬态(无名)方​​法。计时器作为参数传递给它 (t) 是持久对象还是瞬态对象(即,它的值将在 运行 秒内保留)?
  4. 以下代码的哪些部分被redundant/can减少了?

带条件的周期性定时器 运行:

Timer _timer;
Timer _t;

bool userExpectingTimerBool=false;
var timerSearchCount;
var tSearchCount;

_timer = Timer.periodic(
   Duration(seconds: intervalGiven), 
   (Timer t) { 
        _t= t; 
        if (userExpectingTimerBool == false) t.cancel(); 
        tSearchCount=t.tick; 
        _displayResult(); 
   }
); 

timerSearchCount=_timer?.tick;

用户控制的停止定时器功能:

  void stoptimer(){
    setuserExpectingTimerBool(false);
     if (_t !=null){_t!.cancel();}
     if (_timer !=null){_timer!.cancel();}
     checktimerActive();
  }
  1. Timer.periodic 调用其回调时,它应该将其自身作为回调的 Timer 参数来调用。因此 _t 只是 _timer 的别名,同时拥有两者是没有意义的。 (您可以通过打印 identityHashCode(timer) 并与 identityHashCode(_timer) 进行比较来自己验证这一点。)

  2. 参见#1。没关系。

  3. 参见#1。 Timer.periodic.

    创建了一个 Timer 对象
  4. if (userExpectingTimerBool == false)
    

    如果 userExpectingTimerBool 不可为空,那么 if (!userExpectingTimerBool) 会更清楚。 (如果您认为 == false 更具可读性,那么为什么不 if ((userExpectingTimerBool == false) == true)if (((userExpectingTimerBool == false) == true) == true) 等) userExpectingTimerBool 似乎是不必要的;如果 stoptimer 被调用,Timer 将被取消并阻止额外的回调。因此,您不需要在回调中执行额外的取消检查。

    if (_timer !=null){_timer!.cancel();}
    

    正如所写,_timer 不可为空,因此不需要进行空检查。如果您打算 _timer 可以为空,则可以将显式 if 检查替换为 _timer?.cancel();.