更准确地说,我想显示自 API 获取时间戳以来经过的分钟数。应该使用 Stopwatch
或 Timer
还是其他?
答案 0 :(得分:2)
在您的情况下,您应该首先将时间戳解析为 DateTime 对象。然后就可以通过 DateTime 类的不同方法获取获取到的 DateTime 与当前时间之间的时间差。
final Duration myDuration = DateTime.parse(myTimeStamp).difference(DateTime.now));
有关详细信息,请访问 https://api.dart.dev/stable/2.10.4/dart-core/DateTime/difference.html。
定时器和秒表用于异步工作;在您的情况下,您不需要这种复杂程度。
答案 1 :(得分:1)
我建议如下。您可以更新与 Timer 关联的持续时间,以定义它重建小部件的频率。
我还让您决定如何设置持续时间的格式。
class ElapsedTime extends StatefulWidget {
final String timestamp;
const ElapsedTime({
Key key,
@required this.timestamp,
}) : super(key: key);
@override
_ElapsedTimeState createState() => _ElapsedTimeState();
}
class _ElapsedTimeState extends State<ElapsedTime> {
Timer _timer;
DateTime _initialTime;
String _currentDuration;
@override
void didUpdateWidget(ElapsedTime oldWidget) {
super.didUpdateWidget(oldWidget);
if(widget.timestamp != oldWidget.timestamp) {
_initialTime = _parseTimestamp();
_currentDuration = _formatDuration(_calcElapsedTime());
}
}
@override
void initState() {
super.initState();
_initialTime = _parseTimestamp();
_currentDuration = _formatDuration(_calcElapsedTime());
_timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
setState(() {
_currentDuration = _formatDuration(_calcElapsedTime());
});
});
}
Duration _calcElapsedTime() => _initialTime.difference(DateTime.now());
DateTime _parseTimestamp() => DateTime.parse(widget.timestamp);
// TODO update this to fit your own needs
String _formatDuration(final Duration duration) => duration.toString();
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Text(_currentDuration);
}
}
答案 2 :(得分:0)
另一个基于 JayDev's answer 的解决方案有一个属性,表示自“Unix 纪元”以来的毫秒数,例如DateTime.now().millisecondsSinceEpoch
对应于自 1970 年 1 月 1 日以来经过的当前毫秒数。
在 initialize()
方法中,定时器初始化会延迟自整分钟起经过的秒数,否则,它最初会等待 60 秒来增加计数器。
此小部件仅显示自时间戳起的分钟数,可以应用相同的逻辑来显示更多信息。
class ElapsedTime extends StatefulWidget {
final int timestamp;
const _lapsedTime({Key key, this.timestamp}) : super(key: key);
@override
__ElapsedTimeState createState() => _ElapsedTimeState();
}
class _ElapsedTimeState extends State<ElapsedTime> {
Timer _timer;
int counter; // represents the number of minutes
@override
void didUpdateWidget(ElapsedTime oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.timestamp != oldWidget.timestamp) initialize();
}
@override
void initState() {
super.initState();
initialize();
}
void initialize() {
counter = calculateElapsedMinutes();
Future.delayed(Duration(milliseconds: widget.timestamp % 60000))
.then((_) => setupTimerAndIncrement());
}
int calculateElapsedMinutes() =>
((DateTime.now().millisecondsSinceEpoch - widget.timestamp) / 60000)
.floor();
void setupTimerAndIncrement() {
if (!mounted) return; //to prevent calling setState() after dispose()
incrementCounter();
_timer = Timer.periodic(
const Duration(minutes: 1), (Timer t) => incrementCounter());
}
@override
Widget build(BuildContext context) => Text(counter.toString());
void incrementCounter() => setState(() => counter++);
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
}