Flutter 在指定的时间范围内创建多个每周本地通知
Posted
技术标签:
【中文标题】Flutter 在指定的时间范围内创建多个每周本地通知【英文标题】:Flutter create multiple weekly local notification for a specified timeframe 【发布时间】:2019-09-25 17:12:09 【问题描述】:对于我即将推出的健身应用 用户应该能够在周一和周日之间选择多天,选择应该显示通知的小时数和周数。 例如: 我选择星期四和星期五,下午 2 点和 6 周。 所以我应该会在周四和周五下午 2 点看到通知,持续 6 周。
我正在使用“flutter_local_notifications 0.8.3”插件,但它似乎没有我需要的功能,如果你知道像我上面写的那样显示通知的任何不同方法,请随时告诉我。
编辑:
我使用 for 循环设置的预定通知的代码。 但这并不是真正的解决方案
Future<void> scheduleNotification(int id,int, days,int hour, int minute, int second) async
var scheduledNotificationDateTime =
DateTime.now().add(Duration(days: days));
var vibrationPattern = Int64List(4);
vibrationPattern[0] = 0;
vibrationPattern[1] = 1000;
vibrationPattern[2] = 5000;
vibrationPattern[3] = 2000;
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'your other channel id',
'your other channel name',
'your other channel description',
icon: 'app_icon',
largeIcon: 'app_icon',
largeIconBitmapSource: BitmapSource.Drawable,
vibrationPattern: vibrationPattern,
enableLights: true,
color: const Color.fromARGB(255, 255, 0, 0),
ledColor: const Color.fromARGB(255, 255, 0, 0),
ledOnMs: 1000,
ledOffMs: 500);
var iosPlatformChannelSpecifics =
IOSNotificationDetails(sound: "slow_spring_board.aiff");
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.schedule(
id,
'scheduled title',
'scheduled body',
scheduledNotificationDateTime,
platformChannelSpecifics);
每周通知代码
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'show weekly channel id',
'show weekly channel name',
'show weekly description');
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime(
0,
title,
'Weekly notification shown on Monday at approximately $_toTwoDigitString(time.hour):$_toTwoDigitString(time.minute):$_toTwoDigitString(time.second)',
Day.values[value],
time,
platformChannelSpecifics);
给定的问题是我不知道如何在 x 周后停止每周通知
此代码来自插件本身,让您了解该功能的工作原理。 我可以指定日期、时间和重复间隔,但不能指定通知应该激活多长时间。
/// Shows a notification on a daily interval at the specified time
Future<void> showWeeklyAtDayAndTime(int id, String title, String body,
Day day, Time notificationTime, NotificationDetails notificationDetails,
String payload) async
_validateId(id);
var serializedPlatformSpecifics =
_retrievePlatformSpecificNotificationDetails(notificationDetails);
await _channel.invokeMethod('showWeeklyAtDayAndTime', <String, dynamic>
'id': id,
'title': title,
'body': body,
'calledAt': DateTime.now().millisecondsSinceEpoch,
'repeatInterval': RepeatInterval.Weekly.index,
'repeatTime': notificationTime.toMap(),
'day': day.value,
'platformSpecifics': serializedPlatformSpecifics,
'payload': payload ?? ''
);
编辑:代码 sn-p
Future<void> scheduleActivityList() async
for (int i = 0; i < _savedActivityList.length; i++)
if ((_savedActivityList[i].startDate
.difference(DateTime.now())
.inMinutes <= 10080) && (_savedActivityList[i].scheduled == false))
_savedActivityList[i].scheduled = true;
scheduleNotification(await _getNextAvailableId(),_savedActivityList[i].startDate
.difference(DateTime.now())
.inMinutes, _savedActivityList[i].title);
if (_savedActivityList[i].startDate /// deletes past notification
.difference(DateTime.now())
.inMinutes <= 0)
_savedActivityList.removeAt(i);
await saveActivityList();
【问题讨论】:
请发布代码 sn-p,让社区知道您到目前为止为解决问题做了什么。 你好 Kiran,如前所述,我对插件的使用相当有限,您可以在此处查看可用的功能:pub.dev/packages/flutter_local_notifications 我只是用 for 循环安排我需要的通知。这样我会创建太多通知,我相信 I-OS 一次只接受 60 个。我的问题是关于方法。还有一种方法可以在指定的时间和日期显示每周通知,但我真的不知道如何在 6 周后停止通知。 嗨@DavidGetter,您找到解决方案了吗?我自己也遇到过这个问题 @GilesCorreiaMorton 我有一些解决方案,我的想法是我的每个 Activity 对象都有一个 isScheduled 属性。由于日程安排的限制,我只安排了接下来 7 天的所有活动。因此,在应用程序初始化时,如果它们是 isScheduled == false 并且未来少于 7 天,我会检查我的活动并安排它们。我使用了本地通知方法,您可以在其中安排一次。我将编辑我的问题并给你代码 sn-p,我不记得所有内容但我希望它对你有所帮助。 @DavidGetter 太好了,非常感谢。我会试一试,你描述的方法应该适用于我的用例:) 【参考方案1】:-
首先,您需要找到当前日期,例如 22-04-2020 和
您必须按照您的意愿将持续时间添加到 6 周
当天获取结束日期,例如 27-05-2020。
然后你必须循环遍历开始日期和结束日期。
在循环时,您必须采取每个日期并找出是否是
您想要的日子与否。
如果您在给定日期找到所需的日期,例如
星期五为日期 24-04-2020 加上您的时间,然后将此日期传递给 scheduleNotification() 并将此日期设置为变量 scheduleNotificationDateTime。
【讨论】:
以上是关于Flutter 在指定的时间范围内创建多个每周本地通知的主要内容,如果未能解决你的问题,请参考以下文章