Flutter создает несколько еженедельных локальных уведомлений за указанный период времени.

В моем готовящемся к выпуску фитнес-приложении пользователь должен иметь возможность выбрать несколько дней между понедельником и воскресеньем, выбрать час и количество недель, в течение которых должно отображаться уведомление. Например: я выбираю четверг и пятницу, 14:00 и 6 недель. Так что я должен видеть уведомление в четверг и пятницу в 14:00 в течение 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 ?? ''
    });
  }

РЕДАКТИРОВАТЬ: фрагмент кода

 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();
    }
  }

person DavidGetter    schedule 25.09.2019    source источник
comment
опубликуйте фрагмент кода, сообщите сообществу, что вы сделали до сих пор, для решения проблемы.   -  person Kiran Maniya    schedule 25.09.2019
comment
Привет, Киран, как уже упоминалось, я довольно ограничен в плагине, вы можете просмотреть доступные функции здесь: pub.dev/packages / flutter_local_notifications Я только запланировал необходимые мне уведомления с помощью цикла for. Таким образом, я бы создал слишком много уведомлений, и я считаю, что I-OS принимает только 60 одновременно. Мой вопрос скорее о подходе. Также есть способ отображать еженедельные уведомления в указанное время и день, но я действительно не знаю, как остановить уведомление, например, ровно через 6 недель.   -  person DavidGetter    schedule 26.09.2019
comment
Привет, @DavidGetter, ты нашел для этого решение? Я сам столкнулся именно с этой проблемой   -  person Giles Correia Morton    schedule 11.05.2020
comment
@GilesCorreiaMorton У меня было какое-то решение, идея заключалась в том, что каждый из моих объектов Activity имел атрибут isScheduled. Из-за ограничения расписания я запланировал все мероприятия только на следующие 7 дней. Итак, при инициализации приложения я просмотрел свои действия и запланировал их, если они были isScheduled == false, и если они были менее 7 дней в будущем. Я работал с методом локального уведомления, когда вы можете запланировать один раз. Я отредактирую свой вопрос и дам вам фрагмент кода, я не помню всего, но надеюсь, что он вам поможет.   -  person DavidGetter    schedule 11.05.2020
comment
@DavidGetter, это здорово, большое спасибо. Я попробую, описанный вами метод должен хорошо работать в моем случае :)   -  person Giles Correia Morton    schedule 11.05.2020


Ответы (1)


  1. Прежде всего вам нужно найти текущую дату, скажем, 22-04-2020, и вы должны добавить продолжительность, как вы хотите, скажем, 6 недель к текущему дню, чтобы получить дату окончания, скажем, 27-05-2020.
  2. Затем вам нужно перебрать дату начала и дату окончания.
  3. Во время цикла вы должны взять каждое свидание и выяснить, является ли он вашим желаемым днем ​​ или нет.
  4. Если вы найдете желаемый день для данной даты, например пятницу для даты 24-04-2020 с вашим временем, то передайте эту дату в scheduleNotification () и установите эту дату в переменную scheduleNotificationDateTime.
person Aneesh Raj    schedule 22.04.2020