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



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

我现在有一个完全工作的代码。但我觉得有些是多余的在阅读文档后,我仍然不清楚周期性计时器的某些方面。代码如下:


我有四个问题:

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

有条件运行的周期定时器:

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为空,那么您可以用_timer?.cancel();替换显式的if检查。

最新更新