datetime - 如何在 Flutter/Dart 中进行基于时间的事件?
问题描述
我正在编写一个 Flutter 应用程序,它可以根据一天中的某个时间打开和关闭灯。因此,假设时间范围是下午 5 点打开,下午 6 点关闭。如果在此期间打开了应用程序,或者在时间到达时应用程序已经打开,则灯会亮起。
我已经完成了灯光小部件,并将使用不透明度来模拟灯光的开和关。
Container(
height: MediaQuery.of(context).size.height * 0.18,
decoration: new BoxDecoration(
color: Colors.red.withOpacity(0.1),
shape: BoxShape.circle,
),
),
我一直在对 Dart 的DateTime进行一些研究,但我不确定从哪里开始,因为我希望在“打开”窗口期间打开应用程序时打开灯。而且,如果应用程序在“on”窗口之前已经打开,它将在后台轮询,如果“on”窗口命中,灯将打开。
解决方案
Dart 确实有一些原语可用于基于时间触发事件,如本文所述:Dart 有调度程序吗?
当应用程序打开时,使用Stream.periodic()
或可能使用cron 之类的 dart包可以帮助您实现预期的结果。
棘手的部分与后台执行有关。在执行后台任务方面,Android 更加自由,而 iOS 确实锁定了您能够执行的操作。
对于 Android,Flutter 团队实际上编写了一个名为Android Alarm Manager的包,它利用 Android Alarm Manager 服务在警报触发时执行 Dart 代码。
据我所知,iOS 没有完全等价的。在 Flutter Github 上实际上有一个完整的主题。但是,有一个名为background_fetch的包允许您利用两个平台上的后台执行。在此期间,您可以检查本地数据库以查看是否已安排在此期间打开灯并进行必要的调用。不幸的是,这不是一个精确的机制,所以灯可能不会在您想要的确切时间打开。
如果可以选择,最好在服务器端安排这些任务,这样您就可以通过 cron 或类似的方式对调度进行更细粒度的控制。
推荐阅读
- html - 在一个框架中对齐文本和图像需要在图像结束后自动调整图像下方的文本吗?
- vba - 使用 wdFormatDocument 格式保存文档后关闭文档
- angular - 对于来自解析器的数组,无法读取未定义的属性长度
- empirical-lang - 为什么“asof”连接不能既是“最近的”又是“严格的”?
- quarkus - Quarkus Resteasy JSON-B 将列表反序列化为 HashMap 而不是 List
- c# - Task.Delay 或 Thread.Sleep 在同步方法中暂停执行
- ffmpeg - 如何使用 ExoPlayer 在多个客户端上同步 HLS 和/或 MPEG-DASH 视频?
- css - 使用另一个页面调用的 JSP 在 servlet 中引用 css 的正确方法
- unix - unix中的行到列转换
- xml - 如何在 Gradle Kotlin 中合并两个 .xml 文件?