我正在查看 Stopwatch 的文档,我确信他们没有方法以初始值启动秒表。
我正在开发一个需要测量经过时间的应用程序。因此,秒表成为这里显而易见的选择。但是,有一个用例,应用程序的用户在清除后台应用程序时可能会意外关闭应用程序。
由于现在在后台运行 headless dart 代码有点模糊,我认为最好跟踪时间和时间间隙(如果在意外关闭后恢复应用程序时有任何时间间隙)。像下面这样的单独的数据对象可以跟踪时间以及秒表是否正在运行......
class StopwatchTracker{
final stopwatch;
final lastUpdated;
final isRunning;
final systemTime;
StopwatchTracker({this.stopwatch, this.lastUpdated, this.isRunning, this.systemTime});
}
有了这个,我就有了一个对象,其中包含有关秒表的
lastUpdated
时间的数据。
将此与 systemTime
进行比较,后者将是设备的当前系统时间。
现在,我们可以看看 lastUpdated
时间和 systemTime
之间是否存在间隙。如果有间隙,秒表应该以“间隙”为单位“跳跃”到时间。
这个
StopwatchTracker
对象只会在应用程序启动/恢复时初始化,每隔几秒,它就会更新 lastUpdated
时间。我认为逻辑是存在的,但是,正如我提到的,dart 中的 Stopwatch 类没有用起始值初始化它的方法。
我想知道是否可以扩展 Stopwatch 类来容纳一个方法来做到这一点。或者第二个选项是更新
ellapsedMillis
本身或将 gap in mills
添加到 ellapsedMillis
,然后在屏幕上显示结果。
很乐意听到你们的意见!
是的,我可以! > 是的,但实际上不是
我无法设置秒表在某个时间启动/恢复的起始值,甚至无法重新调整当前运行时间。
我发现的最简单的解决方案是像这样扩展 Stopwatch 类:
class StopWatch extends Stopwatch{
int _starterMilliseconds = 0;
StopWatch();
get elapsedDuration{
return Duration(
microseconds:
this.elapsedMicroseconds + (this._starterMilliseconds * 1000)
);
}
get elapsedMillis{
return this.elapsedMilliseconds + this._starterMilliseconds;
}
set milliseconds(int timeInMilliseconds){
this._starterMilliseconds = timeInMilliseconds;
}
}
目前我对这段代码不需要太多。只需在某个时刻启动秒表,然后保持运行即可。并且可以轻松扩展到秒表类的其他
get
类型。
这就是我计划使用该课程的方式
void main() {
var stopwatch = new StopWatch(); //Creates a new StopWatch, not Stopwatch
stopwatch.start(); //start method, not overridden
stopwatch.milliseconds = 10000; //10 seconds have passed
print(stopwatch.elapsedDuration);//returns the recalculated duration
stopwatch.stop();
}
想要使用代码或测试一下吗? 点击这里
我自己偶然发现了这个问题,并认为 SowingFiber 的答案非常棒。我确实稍微改变了你的类,但提供了一个替代的构造函数,允许你立即设置初始时间。
我还使用 elapsedDuration getter 覆盖了 elapsed getter,以防止意外获取原始经过时间。
class RaceStopwatch extends Stopwatch {
int _starterMilliseconds = 0;
RaceStopwatch();
RaceStopwatch.withStartTime({required int timeInMilliseconds})
: _starterMilliseconds = timeInMilliseconds;
@override
Duration get elapsed {
return elapsedDuration;
}
get elapsedDuration {
return Duration(
microseconds: elapsedMicroseconds + (_starterMilliseconds * 1000));
}
get elapsedMillis {
return elapsedMilliseconds + _starterMilliseconds;
}
set milliseconds(int timeInMilliseconds) {
_starterMilliseconds = timeInMilliseconds;
}
}