【发布时间】:2018-11-01 21:31:29
【问题描述】:
我正在尝试在 Flutter 中创建一个倒计时计时器,它每 5 秒打印一次剩余时间,直到计时器用完,然后为列表中的下一个值运行相同的倒计时计时器价值观。
以下递归函数接近,但它会等待“迭代”,然后再转到 List 中的下一个值,即使该 Timer 的剩余时间较少。
import 'dart:async';
Future main() async {
final _sequence = [21, 10, 8];
final _iteration = 5;
void _countdown(seq) async {
if (seq.length > 0) {
var duration = seq[0];
print('Starting at $duration');
Timer.periodic(Duration(seconds: _iteration), (timer) {
var remaining = duration - timer.tick * _iteration;
if (remaining >= 0) {
print('$duration, $remaining');
} else {
timer.cancel();
_countdown(seq.sublist(1));
}
});
}
}
_countdown(_sequence);
}
每次运行的持续时间由_sequence 列表中的值定义。
即使使用CountdownTimer(而不是Timer.periodic)也存在当剩余值小于迭代时等待太久的问题:
import 'package:quiver/async.dart';
main() {
final _sequence = [21, 10, 8];
final _iteration = 5;
void _countdown(seq) {
if (seq.length > 0) {
var duration = seq[0];
print('Starting at $duration');
CountdownTimer countdownTimer = CountdownTimer(
Duration(seconds: duration),
Duration(seconds: _iteration),
);
var sub = countdownTimer.listen(null);
sub.onData((timer) {
if (timer.remaining > Duration(seconds: 0)) {
print('$duration, ${timer.remaining.inSeconds}');
} else {
sub.cancel();
_countdown(seq.sublist(1));
}
});
}
}
_countdown(_sequence);
}
结果应如下所示,行间停顿 5 秒,除非另有说明:
Starting at 21
21, 16
21, 11
21, 6
21, 1 <-- This one should only pause 1 second before continuing
Starting at 10
10, 5
10, 0 <-- This one should immediately continue
Starting at 8
8, 3 <-- This one should only pause 3 seconds before continuing
【问题讨论】:
-
你能解释一下计时器什么时候用完吗?你的持续时间是多少
-
我会回答,一旦我更好地理解你想要达到的目标