在 dart/flutter 中访问和取消周期性计时器
Accessing and cancelling a periodic timer in dart/flutter
我正在使用周期性计时器从服务器获取数据。当 bool (userExpectingTimerBool
) 已设置为 false 时,我需要有条件地停止计时器,并且还需要用户明确停止它。停止后,周期定时器 _timer
和最后调度的回调定时器 _t
(或 t
)都不应该 运行.
我现在有一个完整的工作代码。但是我觉得其中有些是多余的,并且在阅读文档后我对周期性计时器的某些方面仍然不清楚。代码包含在下面。
我有四个问题:
- 我是否需要同时停止
_timer
和 _t
(或 t
)才能停止所有计划任务?
- 我应该使用哪个计时器来显示搜索计数 (
t.tick
/_t.tick
/_timer.tick
)?
- 回调函数是一个瞬态(无名)方法。计时器作为参数传递给它 (
t
) 是持久对象还是瞬态对象(即,它的值将在 运行 秒内保留)?
- 以下代码的哪些部分被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();
}
当 Timer.periodic
调用其回调时,它应该将其自身作为回调的 Timer
参数来调用。因此 _t
只是 _timer
的别名,同时拥有两者是没有意义的。 (您可以通过打印 identityHashCode(timer)
并与 identityHashCode(_timer)
进行比较来自己验证这一点。)
参见#1。没关系。
参见#1。 Timer.periodic
.
创建了一个 Timer
对象
-
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();
.
我正在使用周期性计时器从服务器获取数据。当 bool (userExpectingTimerBool
) 已设置为 false 时,我需要有条件地停止计时器,并且还需要用户明确停止它。停止后,周期定时器 _timer
和最后调度的回调定时器 _t
(或 t
)都不应该 运行.
我现在有一个完整的工作代码。但是我觉得其中有些是多余的,并且在阅读文档后我对周期性计时器的某些方面仍然不清楚。代码包含在下面。
我有四个问题:
- 我是否需要同时停止
_timer
和_t
(或t
)才能停止所有计划任务? - 我应该使用哪个计时器来显示搜索计数 (
t.tick
/_t.tick
/_timer.tick
)? - 回调函数是一个瞬态(无名)方法。计时器作为参数传递给它 (
t
) 是持久对象还是瞬态对象(即,它的值将在 运行 秒内保留)? - 以下代码的哪些部分被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();
}
当
Timer.periodic
调用其回调时,它应该将其自身作为回调的Timer
参数来调用。因此_t
只是_timer
的别名,同时拥有两者是没有意义的。 (您可以通过打印identityHashCode(timer)
并与identityHashCode(_timer)
进行比较来自己验证这一点。)参见#1。没关系。
参见#1。
创建了一个Timer.periodic
.Timer
对象-
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();
.