You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:57:34