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

时间:2019-06-29 23:26:25

标签: 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,但我不确定从哪里开始,因为如果在“打开”窗口中打开应用程序,我希望灯亮。而且,如果该应用在“打开”窗口之前已经打开,它将在后台进行轮询,如果“打开”窗口被点击,则指示灯将打开。

2 个答案:

答案 0 :(得分:0)

Dart确实有一些原语,可用于根据时间触发事件,如本文中所述:Does Dart have a scheduler?

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

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

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

据我所知,iOS尚不完全相同。 Flutter Github上实际上有一个entire thread。但是,有一个名为background_fetch的软件包,可让您在两个平台上利用后台执行。在这段时间内,您可以检查本地数据库以查看是否计划在此期间打开灯并进行必要的调用。不幸的是,这不是一种精确的机制,因此可能无法在您想要的确切时间打开灯。

如果可以选择,最好在服务器端安排这些任务,这样您就可以更精确地控制通过cron或类似方法进行的安排。

答案 1 :(得分:0)

我的应用遇到了类似的情况,我必须在一天中的某个时间触发一个事件。

首先,我创建了一个 DateTime 实例并将其保存在 Firestore 上。您也可以将该 DateTime 实例保存在本地数据库中,例如:SQFlite 等

//DateTime instance with a specific date and time-
DateTime atFiveInEvening;
//this should be a correctly formatted string, which complies with a subset of ISO 8601
atFiveInEvening= DateTime.parse("2021-08-02 17:00:00Z");


//Or a time after 3 hours from now
DateTime threehoursFromNow;
threeHoursFromNow = DateTime.now().add(Duration(hours: 3));

现在使用 ID 将此实例保存到 FireStore-

saveTimeToFireStore() async {
await FirebaseFirestore.instance.collection('users').doc('Z0ZuoW8npwuvmBzmF0Wt').set({
  'atFiveInEvening':atFiveInEvening,    
  });
}

现在在应用打开时从 Firestore 检索此设置时间-

getTheTimeToTriggerEvent() async {
final DocumentSnapshot doc =
    await FirebaseFirestore.instance.collection('users').doc('Z0ZuoW8npwuvmBzmF0Wt').get();
 timeToTriggerEvent= doc['atFiveInEvening'].toDate();


//Now use If/Else statement to know, if the current time is same as/or after the 
//time set for trigger, then trigger the event, 

if(DateTime.now().isAfter(timeToTriggerEvent)) {
//Trigger the event which you want to trigger.
  }
}

但是在这里我们必须一次又一次地运行函数 getTheTimeToTriggerEvent() 来检查时间是否到了。