#flutter
#flutter
Вопрос:
Итак, у меня есть приложение, в котором пользователям напоминают принимать лекарства каждый день в определенное время в течение определенного интервала дат. Например, пользователь может выбрать получение уведомления с 16 по 18 сентября 2020 года в определенное время суток
Мой подход: я планирую уведомление, используя flutter_local_notifications
пакет с showDailyAtTime()
функцией. Однако проблема, с которой я сталкиваюсь, заключается в том, что, предположим, я не открываю приложение снова, нет способа отменить запланированное уведомление, и, таким образом, уведомление появляется даже после указанного диапазона дат. Я бы хотел, чтобы уведомления были отключены, поэтому Firebase, похоже, не подходит.
Ответ №1:
Вы можете решить проблему с помощью плагина FlutterLocalNotificationsPlugin.
Подход заключался бы в вызове метода rescheduleNotifications
при каждом запуске приложения. В методе все уведомления удаляются и устанавливаются следующие уведомления. В calculateNotificationTimes
, например, вы рассчитываете все уведомления за следующие 30 дней. Например, все уведомления с 16 сентября 2020 года по 18 сентября 2020 года каждый день в выбранное вами время.
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
Future<void> rescheduleNotifications() async {
final localNotificationsPlugin = FlutterLocalNotificationsPlugin();
const initializationSettings = InitializationSettings(AndroidInitializationSettings('app_icon'), IOSInitializationSettings());
const androidChannelSpecifics = AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description');
const iOSNotificationDetails = IOSNotificationDetails();
const notificationsDetails = NotificationDetails(androidChannelSpecifics, iOSNotificationDetails);
await localNotificationsPlugin.initialize(initializationSettings);
await localNotificationsPlugin.cancelAll();
// Calculate the next notifications.
final notificationTimes = calculateNotificationTimes();
var _currentNotificationId = 0;
for (final time in notificationTimes) {
localNotificationsPlugin.schedule(
_currentNotificationId ,
"It's time to take your medicine.",
'Take the red pill',
time,
notificationsDetails,
androidAllowWhileIdle: true,
);
}
}
На iOS существует ограничение, согласно которому у вас может быть включено только 64 уведомления. Недостатком этого метода на iOS является то, что если пользователь не откроет приложение после 64 уведомлений, уведомление отображаться не будет. Я думаю, это нормально, потому что кажется, что пользователь больше не использует приложение.
Не тестировал код.
Комментарии:
1. При этом уведомление не будет появляться каждый день, если я не открою приложение правильно? Кроме того, даже отмена происходит, только если я открываю приложение. Я думаю, что это возвращает ту же проблему
2. С помощью этого метода уведомления могут отображаться каждый день. Для этого методу ‘calculateNotificationTimes’ потребуется выводить только один раз за каждый день. Это имеет преимущество перед showDailyAtTime в том, что ненужные уведомления не могут отображаться.