1.关于Timer
- Flutter中的定时器
- 任务添加在事件队列
- Timer异步执行
2.Timer延迟执行任务
Timer(Duration duration, void Function() callback)
- 类似于
Futuer.delayed
,延迟一段时间执行任务
-
duration
延迟多长时间再执行任务
timerDelay() {
Timer(const Duration(seconds: 5), () {
print('延迟了5秒执行任务');
});
print('外部代码');
// flutter: 外部代码
// flutter: 延迟了5秒执行任务
}
3.Timer.run()
timerRun() {
Timer.run(() {
print('执行任务');
});
print('外部代码');
// flutter: 外部代码
// flutter: 执行任务
}
4.Timer.periodic
Timer.periodic(Duration duration, void callback(Timer timer))
- 周期性的执行任务
- 定时器常用的一个工厂构造方法
timerPeriodic() {
int _count = 0;
//每个1秒执行一次任务
Timer.periodic(const Duration(seconds: 1), (timer) {
_count += 1;
print(_count);
});
}
5.当多个事件队列执行时,是否会影响Timer的执行?
-
问题的引入:iOS中TableView滑动列表会影响Timer的执行,只有修改runloop的mode后,定时器才能正常执行
- 经验证发现,当timer在执行时,滚动ListView不会影响timer异步任务的执行。可以看出Flutter已经对timer做了优化
6.当我们在使用定时器的时候,是否需要考虑手动释放的问题?
- 经验证发现,如果定时器在执行时,当Widget释放时,会造成内存泄漏,虽然页面释放了,但是timer没有被释放掉
- 此时需要引入Widget中的一个生命周期方法,
dispose
- 在dispose内,如果
_timer != null && _timer!.isActive
,执行_timer.cancel
来取消并释放掉timer
@override
void dispose() {
// TODO: implement dispose
if (_timer != null && _timer!.isActive) {
_timer!.cancel();
}
super.dispose();
}
网友评论