I'm looking to call a function at 10am, 10.05am, 10.10am, 10.15am....
I tried using
Timer.periodic(Duration(minutes: 5), (Timer t) { function...})
But it doesn't call the function at 10am, 10.05am... If I were to start the timer at 10.02am, it will call the function at 10.07am, 10.12am. Any idea how to workaround this? Thanks in advance!
I found a workaround where i use a timer to trigger a periodic timer
Rough code as shown below:
Timer(nextFiveMinInterval.difference(DateTime.now()),
() { Timer.periodic(Duration(minutes: 5), (Timer t) { function...})
})
Related
I am trying to get a switch widget to turn off at a specific time of the day.
I have read a lot of the documentations like these
https://stackoverflow.com/questions/15848214/does-dart-have-a-scheduler
https://pub.dev/packages/cron
https://pub.dev/packages/scheduled_timer
All of these which can only allow me to set duration instead of a specific time.
Thus, my only approach right now is by setting up the timer when the switch is turned on.
e.g. 8hrs then it turns off.
Problem: If the user turned on the switch late, the time that it turns off will also be delayed.
So is there an actual way to set an event at a specific time + works even after we onstop/terminate the application?
You can try to do something like this:
I'll simplify the specific time into :
...
var setTime = DateTime.utc(2022, 7, 11, 8, 48, 0).toLocal();
StreamSubscription? subscription;
...
Then you can assign a periodic stream listener:
...
// periodic to run every second (you can change to minutes/hours/others too)
var stream = Stream.periodic(const Duration(seconds: 1), (count) {
//return true if the time now is after set time
return DateTime.now().isAfter(setTime);
});
//stream subscription
subscription = stream.listen((result) {
// if true, insert function and cancel listen subscription
if(result){
print('turn off');
subscription!.cancel();
}
// else if not yet, run this function
else {
print(result);
}
});
...
However, running a Dart code in a background process is more difficult, here are some references you can try:
https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124
https://pub.dev/packages/flutter_background_service
I hope it helps, feel free to comment if it doesn't work, I'll try my best to help.
After some time I figured it out.
Format
cron.schedule(Schedule.parse('00 00 * * *'), () async {
print("This code runs at 12am everyday")
});
More Examples
cron.schedule(Schedule.parse('15 * * * *'), () async {
print("This code runs every 15 minutes")
});
To customize a scheduler for your project, read this
I am listening to an event, however, I don't want to print the event every time. There is an event being sent every second but I don't want my print to work every second. How can I make the print inside this listener to fire only, if 10 seconds is past since last event?
For e.g I receive an event, I use the print. I want to store the event somewhere, if 10 seconds is passed since last event, accept another event -> print and so on.
_controller.onLocationChanged.listen((event) {
print(event);
});
You may try something related to an asynchronous method as such. The following code will set the _isListening variable to true after 10 seconds, which will enable the listener to do it's action once again.
class YourClass{
bool _isListening = true;
void yourMethod() {
_controller.onLocationChanged.listen((event) {
if(_isListening){
_isListening = false;
print(event);
Future.delayed(const Duration(seconds: 10)).then((_) => _isListening=true);
}
});
}
}
Edit: Thanks to #pskink, the proper way to do it would be by using the debounceTime method. So in proper way:
_controller.onLocationChanged
.debounceTime(Duration(seconds: 10))
.listen((event) {
print(event);
});
Use the Timer like below:
Timer(const Duration(seconds: 10), (){
print("...");
});
I have this simple send mail function in Flutter, and I would like it to be executed (sent) for example every 48 hours. How would I go around doing that? Is there a simple way to time when it is executed? I don't think code is necessary here, but let me know if you need my send mail function (it is regular Mailer function).
You could use the Timer class:
const everySecondDay = const Duration(hours: 48);
final timer = Timer.periodic(everySecondDay, (Timer t) => sendMailFunction());
Then cancel it when appropriate:
timer.cancel();
**every 5 seconds something will be called**
Timer.periodic(Duration(seconds: 5), (timer) {
//something();
});
**every 1 minute something() will be called.**
var cron = new Cron();
cron.schedule(new Schedule.parse('*/1 * * * *'), () async {
// something();
});
but both don't execute the job if is the app no longer in the memory.
The advantage of Cron over Timer is that with Cron Syntax you can specify complex time intervals and not only constant duration intervals.
For example it's difficult to execute a function every day at a specific time (e.g 6:05pm) with Timer because it depends on your start time to which it adds a constant duration, not like Cron you can just put:
var cron = new Cron();
cron.schedule(new Schedule.parse('5 6 * * *'), () async {
// something();
});
To sum up, if your goal is only to repeat a task over a constant interval use Timer, if you goal is more complex like repeating a task every 2 months in weekdays at 6pm you may need Cron.
var cron = new Cron();
cron.schedule(new Schedule.parse('0 6 * */2 MON-FRI'), () async {
// something();
});
Here is a link to know more about Cron syntax : corn syntax
I want to use Timer in my app with interval of 3secs. How to use this component. I gone through SmartfaceTimerDoc But, didn't get complete info.
Can any one help on this.
Thanks in Advance
Below is the example which initiate the function after 3 sec
var timeoutID;
function setHello() {
timeoutID = setTimeout(function () {
alert("Hello");
}, 3000);
}
function cancelHello() {
clearTimeout(timeoutID);
}