如何省略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:~/10是Dart的整数除法,将毫秒数除以10,把精度从1毫秒降到10毫秒,得到0-99的数值范围%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
相关产品推荐
相关产品推荐

