如何在 Flutter/Dart 中执行基于时间的事件?

ATL*_*ris 5 datetime dart flutter

我正在编写一个 Flutter 应用程序,它可以根据一天中的某个时间打开和关闭灯。因此,假设时间范围是在下午 5 点打开并在下午 6 点关闭。如果在这段时间内打开了应用程序,或者如果时间到了应用程序已经打开,则灯会亮起。

我已经完成了所有的灯光小部件,并将使用不透明度来模拟灯光的开启和关闭。

Container(
  height: MediaQuery.of(context).size.height * 0.18,
  decoration: new BoxDecoration(
    color: Colors.red.withOpacity(0.1),
    shape: BoxShape.circle,
  ),
),
Run Code Online (Sandbox Code Playgroud)

我一直在对 Dart 的DateTime进行一些研究,但我不确定从哪里开始,因为如果在“打开”窗口期间打开应用程序,我希望灯打开。而且,如果应用程序在“开”窗口之前已经打开,它将在后台轮询,如果“开”窗口命中,则灯会亮起。

jdi*_*n04 6

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

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

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

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

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

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