如何在Flutter中在一定时间内执行一个方法?

d4so4syb  于 2023-03-31  发布在  Flutter
关注(0)|答案(4)|浏览(205)

我怎么能在固定的时间内执行一个方法,就像我想在下午2:30运行一个方法一样。我知道定时器函数,但是运行一个定时器函数这么长时间是个好主意吗?同样,这个方法在一天中会被调用很多次。

**编辑:**我试过android_alarm_manager,但不适合我的情况(因为我需要从回调方法调用bloc),而且我不需要在后台运行我的应用。

任何帮助都将不胜感激

mzmfm0qo

mzmfm0qo1#

你可以这样使用:
定义***DateTime***和***StreamSubscription***. .

var setTime = DateTime.utc(2023, 3, 29, 14, 59, 0).toLocal();
StreamSubscription? subscription;

将流设置为定期运行/触发。

var stream = Stream.periodic(const Duration(days: 1), (count) {
     return DateTime.now().isAfter(setTime);
});

现在,听你的流如下。

subscription = stream.listen((result) {
    print('running');
    subscription!.cancel();
    print(result);
  });
zaq34kh6

zaq34kh62#

DateTime yourTime;
VoidCallback yourAction;
Timer(yourTime.difference(DateTime.now()), yourAction);
izkcnapc

izkcnapc3#

我的应用程序也有类似的情况,我必须在一天中的某个时间触发一个事件。
我们不能使用计时器功能,因为一旦应用程序关闭,操作系统就会杀死应用程序,计时器也会停止运行。
因此,我们需要在某个地方保存时间,然后检查它,如果节省的时间现在已经到来。
首先,我创建了一个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));

现在将此示例保存到FireStore,并使用ID-

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()函数来检查时间是否到了。

bmvo0sr5

bmvo0sr54#

您可以尝试Cron
格式

cron.schedule(Schedule.parse('00 00 * * *'), () async {
     print("This code runs at 12am everyday")
  });

更多示例

cron.schedule(Schedule.parse('15 * * * *'), () async {
     print("This code runs every 15 minutes")
  });

要为项目自定义调度程序,请阅读this

相关问题