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

如何省略StopWatchWidget计时器毫秒数的最后一位数字?

解决Flutter自定义计时器毫秒显示两位的问题

直接修改代码中毫秒部分的计算逻辑即可,核心是将毫秒数转换为10毫秒级精度的数值,确保输出始终是两位数字:

修改前的问题代码行:

'${(_stopwatch.elapsed.inMinutes % 60).toString().padLeft(2, '')}.${(_stopwatch.elapsed.inSeconds % 60).toString().padLeft(2, '0')}.${(_stopwatch.elapsed.inMilliseconds % 1000).toString().padLeft(2, '0')}'

修改后的代码行:

'${(_stopwatch.elapsed.inMinutes % 60).toString().padLeft(2, '0')}.${(_stopwatch.elapsed.inSeconds % 60).toString().padLeft(2, '0')}.${((_stopwatch.elapsed.inMilliseconds ~/ 10) % 100).toString().padLeft(2, '0')}'

关键修改说明:

  • 把_stopwatch.elapsed.inMilliseconds % 1000替换为(_stopwatch.elapsed.inMilliseconds ~/ 10) % 100:
    1. ~/10是Dart的整数除法,将毫秒数除以10,把精度从1毫秒降到10毫秒,得到0-99的数值范围
    2. %100确保数值始终在0-99之间,避免出现三位数字
  • 补充优化:原代码中分钟部分的padLeft(2, '')建议改成padLeft(2, '0'),这样分钟数小于10时会显示前导零(比如05而非5),和秒、毫秒的格式保持统一

优化后的完整计时器更新逻辑:

Timer.periodic(const Duration(milliseconds: 10), (timer) { // 将周期改为10毫秒,减少不必要的setState调用
  setState(() {
    if (!_stopwatch.isRunning) {
      timer.cancel();
    }
    final minutes = (_stopwatch.elapsed.inMinutes % 60).toString().padLeft(2, '0');
    final seconds = (_stopwatch.elapsed.inSeconds % 60).toString().padLeft(2, '0');
    final milliseconds = ((_stopwatch.elapsed.inMilliseconds ~/ 10) % 100).toString().padLeft(2, '0');
    stopWatchText = '$minutes.$seconds.$milliseconds';
  });
});

额外建议:把计时器的周期从1毫秒调整为10毫秒,因为我们只需要10毫秒级的精度,这样可以大幅减少setState的调用次数,提升组件性能。

内容的提问来源于stack exchange,提问作者Spicy Pumpkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:13:14