【发布时间】:2020-10-15 12:14:14
【问题描述】:
我实现了一个 Timer,但它似乎没有在正确的持续时间后调用 callback() 函数,它从几秒钟后调用回调开始,并在每次调用回调时加速。 前任。 5 秒 --> 回调(), 4 秒 --> 回调(), 2 --> 回调(), 0.3 秒 --> 回调() ...
我想要一个计时器,每秒钟减少一个 int 的值。
当前代码 - ViewModel:
void displayCountdown(Item item) {
timer = Timer.periodic(const Duration(seconds: 1), (Timer _timer) => {
if (lead.remainingTime >= 1) {
item.remainingTime = item.remainingTime -= 1,
notifyListeners(),
}else {
print('out of time'),
_timer.cancel(),
notifyListeners(),
}
});
}
代码 - 视图:
ListTile _tile(Item item) {
widget.model.displayCountdown(item);
Duration duration = Duration(milliseconds: item.remainingTime);
String countdown = '${duration.toString().split('.')[0]}';
return ListTile(
leading: CircleAvatar(
backgroundImage: item.author["avatarUrl"] == "" ? NetworkImage('https://picsum.photos/250?image=3') : NetworkImage(lead.author["avatarUrl"]),
),
title: Text(item.author["fullName"]),
subtitle: Text(item.keywords.toString()),
trailing: Row(mainAxisSize: MainAxisSize.min, children: [Text('$countdown', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey))],),
);
}
【问题讨论】:
-
“它从几秒钟后调用回调开始,每次调用回调时都会加快速度” ...您确定您没有为同一个@创建多个
Timers 987654324@s? -
不,我不这么认为。我还不太习惯颤抖。也许每次我调用
widget.model.displayCountdown(lead);时它都会创建一个新的,因此它会加速它?我创建 Timer 的唯一地方是 displayCountdown()。 -
是的,每次调用
widget.model.displayCountdown(),都会创建一个新的周期性@987654327@对象。它不会影响现有的Timers,但是您的运行次数会比您预期的要多,因此您会观察到更多的回调被触发。如果您的意图是每个Item有一个Timer,我建议您维护一个Map<Item, Timer>,这样您就可以避免创建一个新的Timer(如果已经存在)(或者这样您就可以取消现有的)。 -
谢谢,但我找到了替代 x)。