Flutter秒表运行速度异常偏慢求助:实际速度仅为正常的0.5倍
我来帮你搞定这个秒表走慢的问题,其实核心问题出在你计算时间的逻辑上,咱们一步步拆解:
为什么秒表会变慢?
你现在的实现是用Timer.periodic每1毫秒触发一次,每次给_duration加1毫秒——但这个思路有致命问题:
- Flutter的事件循环无法保证高频定时任务准时执行:1毫秒的间隔太极端了,UI渲染、用户交互、其他异步任务都会抢占事件循环的时间,导致实际触发间隔远大于1毫秒,但你每次还是只加1毫秒,累计下来自然会比真实时间慢很多。
- 高频任务加剧性能问题:1毫秒一次的任务会把事件循环占满,进一步拖慢应用运行,反过来让定时任务的延迟更严重,形成恶性循环。
修复方案:基于真实时间差计算
正确的做法是记录秒表启动的时间点,每次更新时直接计算当前时间和启动时间的差值,这样不管Timer触发间隔有多大,计算出来的时间都是和真实时间完全一致的。
修改后的完整代码如下:
class TimerState extends ChangeNotifier { late String _stringTimer; late DateTime _startTime; Timer? _timer; Duration _elapsedBeforePause = Duration.zero; // 支持暂停后继续计时 TimerState() { _stringTimer = '00:00.00'; } String get get => _stringTimer; void start() { // 如果是暂停后继续,用之前累计的时间调整启动时间 _startTime = DateTime.now().subtract(_elapsedBeforePause); // 把定时间隔改成50ms,足够流畅且不占用过多资源 _timer = Timer.periodic(const Duration(milliseconds: 50), (_) => _updateTime()); } void pause() { _timer?.cancel(); // 暂停时保存已经累计的时间 _elapsedBeforePause = DateTime.now().difference(_startTime); } void reset() { _timer?.cancel(); _stringTimer = '00:00.00'; _elapsedBeforePause = Duration.zero; notifyListeners(); } void _updateTime() { // 计算从启动(或上次暂停后启动)到现在的真实时间差 final Duration totalElapsed = DateTime.now().difference(_startTime); _formattedTimer(totalElapsed); } void _formattedTimer(Duration duration) { String twoDigits(int n) => n.toString().padLeft(2, '0'); final milliseconds = twoDigits((duration.inMilliseconds.remainder(1000) / 10).floor()); final seconds = twoDigits(duration.inSeconds.remainder(60)); final minutes = twoDigits(duration.inMinutes.remainder(60)); _stringTimer = '$minutes:$seconds.$milliseconds'; notifyListeners(); } }
额外说明
- 我把定时间隔改成了50ms,这个间隔足以让秒表看起来流畅(人眼完全分辨不出差异),同时大大降低事件循环的压力,避免不必要的性能消耗。
- 新增了暂停和重置的完整逻辑,支持暂停后继续计时的场景,实用性更强。
内容的提问来源于stack exchange,提问作者chrisrn
相关产品推荐
相关产品推荐

