Flutter中如何让Timer.periodic函数调用后立即触发执行回调
Flutter 实现Timer.periodic首次立即执行的解决方案
原生Timer.periodic的设计逻辑就是首次触发需要等待完整间隔时长,要实现立即触发可以用以下两种方案:
方案1:先手动执行一次回调逻辑
把定时器要执行的代码抽成独立方法,创建定时器前先调用一次该方法即可:
// 抽离回调逻辑为独立方法 Future<void> handleTimerTick(Timer timer) async { // 要执行的代码 } // 先调用一次 handleTimerTick(null); // 再初始化周期定时器 Timer.periodic(durationBetweenPayoutIterations, handleTimerTick);
如果不需要单独复用逻辑,也可以直接把逻辑封装成闭包,写法更简洁:
final callback = (Timer timer) async { // Code to be executed }; callback(null); Timer.periodic(durationBetweenPayoutIterations, callback);
注意如果回调逻辑里用到了timer实例本身,首次调用传null要做好判空处理,或者换用下面的封装方案。
方案2:封装自定义周期定时器工具
如果需要多处用到立即执行的周期定时器,可以封装成通用工具函数:
Timer runPeriodic(Duration duration, void Function(Timer timer) callback, {bool runImmediately = true}) { final timer = Timer.periodic(duration, callback); if (runImmediately) { callback(timer); } return timer; } // 使用时直接调用,默认首次立即执行 runPeriodic(durationBetweenPayoutIterations, (timer) async { // 要执行的代码 });
这种方案在首次调用回调时就已经传入了正常的timer实例,即使首次执行逻辑中需要取消定时器也可以正常操作,通用性更强。
内容的提问来源于stack exchange,提问作者Jack Maring
相关产品推荐
相关产品推荐

