首页 > 解决方案 > 如何在 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”窗口命中,灯将打开。

标签: datetimeflutterdart

解决方案


Dart 确实有一些原语可用于基于时间触发事件,如本文所述:Dart 有调度程序吗?

当应用程序打开时,使用Stream.periodic()或可能使用cron 之类的 dart包可以帮助您实现预期的结果。

棘手的部分与后台执行有关。在执行后台任务方面,Android 更加自由,而 iOS 确实锁定了您能够执行的操作。

对于 Android,Flutter 团队实际上编写了一个名为Android Alarm Manager的包,它利用 Android Alarm Manager 服务在警报触发时执行 Dart 代码。

据我所知,iOS 没有完全等价的。在 Flutter Github 上实际上有一个完整的主题。但是,有一个名为background_fetch的包允许您利用两个平台上的后台执行。在此期间,您可以检查本地数据库以查看是否已安排在此期间打开灯并进行必要的调用。不幸的是,这不是一个精确的机制,所以灯可能不会在您想要的确切时间打开。

如果可以选择,最好在服务器端安排这些任务,这样您就可以通过 cron 或类似的方式对调度进行更细粒度的控制。


推荐阅读