I am trying to implement the local notification in flutter where user set the notification coming days like coming in sunday, monday and tuesday , and then user set the time range like between 4-5pm and finally user set the interval of time in which notification/alert comes like every 5 minutes. So the notification should come in selected days only and selected time range and in every interval time gap.
final Random random = Random();
int randomNumber = random.nextInt(100);
final DateTime now = DateTime.now();
DateTime startDate = convertTimeOfDayToDateTime(startTime);
DateTime endDate = convertTimeOfDayToDateTime(endTime);
// Loop through each day of the week
for (int i = 0; i < 7; i++) {
// Calculate the next occurrence of this day
DateTime nextOccurrence =
now.add(Duration(days: (i - now.weekday + 7) % 7));
// Check if the day is selected
if (_selectedDays[nextOccurrence.weekday % 7]) {
DateTime notificationStart = DateTime(
nextOccurrence.year,
nextOccurrence.month,
nextOccurrence.day,
startDate.hour,
startDate.minute);
DateTime notificationEnd = DateTime(
nextOccurrence.year,
nextOccurrence.month,
nextOccurrence.day,
endDate.hour,
endDate.minute);
// Only schedule if the start date is in the future
if (notificationStart.isAfter(now)) {
int totalDuration = notificationEnd.millisecondsSinceEpoch -
notificationStart.millisecondsSinceEpoch;
int numberOfIntervals = totalDuration ~/ 60000;
logger.d(
'Scheduling notifications for: $nextOccurrence (day ${nextOccurrence.weekday})');
await scheduleNotificationsForDay(notificationStart,
numberOfIntervals, randomNumber, 60000, notificationEnd);
}
} else {
logger.d(
'Skipping notifications for: $nextOccurrence (day ${nextOccurrence.weekday})');
}
}
}
DateTime convertTimeOfDayToDateTime(TimeOfDay timeOfDay) {
final now = DateTime.now();
return DateTime(
now.year, now.month, now.day, timeOfDay.hour, timeOfDay.minute);
}
tz.TZDateTime _convertToTZDateTime(DateTime dateTime) {
final tzLocation = tz
.local; // Use the appropriate timezone or tz.getLocation('Your/Timezone')
return tz.TZDateTime.from(dateTime, tzLocation);
}
Future<void> scheduleNotificationsForDay(DateTime start,
int numberOfIntervals, int idBase, int interval, DateTime end) async {
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
for (int i = 0; i < numberOfIntervals; i++) {
final scheduledTime = start.add(Duration(milliseconds: i * interval));
if (scheduledTime.isBefore(end)) {
final tzScheduledTime = _convertToTZDateTime(scheduledTime);
// Schedule your notification here
await flutterLocalNotificationsPlugin.zonedSchedule(
idBase + i,
'Notification Title',
'Notification Body',
tzScheduledTime,
const NotificationDetails(
android: AndroidNotificationDetails(
'channel id',
'channel name',
),
),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.wallClockTime,
matchDateTimeComponents:
DateTimeComponents.time, // To match the exact time for recurrence
);
}
}
}```