如何解决在 dart/flutter 中访问和取消定期计时器
我正在使用定期计时器从服务器获取数据。当 bool (userExpectingTimerBool
) 已设置为 false 时,我需要有条件地停止计时器,并由用户明确停止它。停止后,周期计时器 _timer
和最后一个调度的回调计时器 _t
(或 t
)都不应运行。
我现在有一个完整的代码。但是我觉得其中一些是多余的,并且在阅读文档后,我仍然不清楚定期计时器的某些方面。代码包含在下面。
我有四个问题:
- 是否需要同时停止
_timer
和_t
(或t
)才能停止所有计划任务? - 我应该使用哪个计时器来显示搜索计数 (
t.tick
/_t.tick
/_timer.tick
)? - 回调函数是一个瞬态(无名)方法。计时器作为参数传递给它 (
t
) 是持久对象还是瞬态对象(即,它的值将在运行中保留)? - 以下代码的哪些部分是多余的/可以减少的?
带条件运行的定期计时器:
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();
}
解决方法
-
当
Timer.periodic
调用它的回调函数时,它应该使用它自己作为回调函数的Timer
参数来调用它。因此_t
只是_timer
的别名,两者兼有是没有意义的。 (您可以通过打印identityHashCode(timer)
并与identityHashCode(_timer)
进行比较来自己验证这一点。) -
见#1。没关系。
-
见#1。
Timer
创建了一个Timer.periodic
对象。 -
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();
检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。