firebase - Flutter + Firebase - 计算剩余时间
问题描述
我正在尝试计算从将帖子添加到数据库时剩下的时间。我希望多个设备看到相同的倒数计时器。
round {
seconds: 5,
time: 1619971281887 (ServerValue.timstamp)
}
并使用以下代码计算剩余时间。此代码改编自如何在 Firebase 中实现分布式倒数计时器中的代码
databaseReference.child(code).child("round").onValue.listen((event) {
var seconds = event.snapshot.value['seconds'];
var startAt = event.snapshot.value['time'];
Timer.periodic(new Duration(seconds: 1), (timer) {
var timeLeft = (seconds * 1000) -
((DateTime.now().millisecondsSinceEpoch -
startAt -
serverTimeOffset));
print("Seconds");
print(seconds * 1000);
print("Time Now");
print(DateTime.now().millisecondsSinceEpoch);
print("Start At");
print(startAt);
print("Offset");
print(serverTimeOffset);
print("Time Left");
print(timeLeft);
if (timeLeft < 0) {
timer.cancel();
} else {
var show = (timeLeft / 1000).floor();
var per = (timeLeft % 1000);
//print(show);
//print(per);
}
});
});
为了查看上面的代码是否正常工作,我添加了几个打印调用。问题是 startAt 出于某种原因不断更新自己。不知道为什么会这样。如果有人能提供一些启示,将不胜感激。
控制台的一些输出如下:
flutter: Start At
flutter: 1619982194189
flutter: Time Left
flutter: 10506.6201171875
flutter: Start At
flutter: 1619982193226
flutter: Time Left
flutter: 9315.6201171875
解决方案
如果您onValue
被多次调用,则意味着数据库中的值正在更新。您共享的代码不会发生任何此类更新,因此我建议您在其余代码中搜索此类写入。
您还应该能够通过查看 Firebase 控制台中的节点来查看更新。这使您可以准确地看到更新发生的时间,并且可能更容易找到 source.ce
最后,如果您不关心更新,您可以使用once()
onValue 来仅从数据库中获取一次值。
推荐阅读
- java - 操作您是其公共对象的不同类的公共变量
- c - 在C中按字母顺序排序链表的问题
- unix - 在 awk 中使用 if-else 语句时的 OFS
- string - AppleScript - 我怎样才能让这个字符串正确通过?
- angular - PrimeNG 生产错误的 Angular 构建
- javascript - 访问包含字符的对象键:
- mongodb - Kubernetes 部署容器内的应用程序失败并出现错误 localhost:port 无法访问?
- maven - TestNg - 通过 mvn 命令行排除一个类(testrunner)
- python - 如何从python中的单个类继承一个类的多个实例
- c# - 我可以减少这些代码行吗? 使双键按下以在两个 if/else if 选项之间切换