Флаттер: Планирование Локальных Уведомлений

#flutter #dart #flutter-local-notification

Вопрос:

Я пытаюсь установить запланированное оповещение о тревоге с выбранной пользователем даты и времени, которые я использовал showDatePicker для кода ниже

 DateTime _selectedDateAndTime;

  Future _selectDayAndTimeL(BuildContext context) async {
    DateTime _selectedDay = await showDatePicker(
        context: context,
        initialDate: DateTime.now(),
        firstDate: DateTime(2021),
        lastDate: DateTime(2030),
        builder: (BuildContext context, Widget child) => child);

    TimeOfDay _selectedTime = await showTimePicker(
      context: context,
      initialTime: TimeOfDay.now(),
    );

    if (_selectedDay != null amp;amp; _selectedTime != null) {
      //a little check
    }
    setState(() {
      _selectedDateAndTime = DateTime(
        _selectedDay.year,
        _selectedDay.month,
        _selectedDay.day,
        _selectedTime.hour,
        _selectedTime.minute,
      );
      // _selectedDate = _selectedDay;
    });
    // print('...');
  }
 

в котором после выбора даты и времени значение форматируется так, как показано на рисунке ниже

введите описание изображения здесь

Теперь я хочу иметь возможность установить запланированное уведомление, используя значение из выбора, но не знаю, как это сделать… я установил Flutter_Local_Notification и импортировал его в свой main.dart, установил разрешение в файле манифеста, а также попытался запустить плагин, как показано ниже

 FlutterLocalNotificationsPlugin fltrNotification;
  String _selectedParam;
  int val;

  @override
  void initState() {
    super.initState();
    var androidInitilize = new AndroidInitializationSettings('app_icon');
    var iOSinitilize = new IOSInitializationSettings();
    var initilizationsSettings =
        new InitializationSettings(androidInitilize, iOSinitilize);
    fltrNotification = new FlutterLocalNotificationsPlugin();
    fltrNotification.initialize(initilizationsSettings,
        onSelectNotification: notificationSelected);
  }
 

и я также добавил файл app_icon.png в свою папку для рисования

я попытался следовать некоторым учебным пособиям о том, как это сделать, но большинство из них показывают только, как установить сетку с использованием секунд, но для моего собственного проекта я хочу установить расписание на определенный день, час и минуту

пожалуйста, как я могу этого достичь?

Ответ №1:

Вы можете использовать этот мой вспомогательный класс

 class NotificationPlugin {
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  var initializationSettings;

  NotificationPlugin._() {
    init();
  }

  init() async {
    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    if (Platform.isIOS) {
      _requestIOSPermission();
    }
    initializePlatformSpecifics();
  }

  initializePlatformSpecifics() {
    var initializationSettingsAndroid = AndroidInitializationSettings(
        'mipmap/ic_launcher'); // <- default icon name is @mipmap/ic_launcher
    var initializationSettingsIOS =
        IOSInitializationSettings(onDidReceiveLocalNotification: (int a, String b, String c, d) {});
    var initializationSettings =
        InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: (String s) {});

    initializationSettings =
        InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
  }

  _requestIOSPermission() {
    flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()
        .requestPermissions(alert: false, badge: true, sound: true);
  }

  setOnNotificationClick(Function onNotificationClick) async {
    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onSelectNotification: (payload) async {
        onNotificationClick(payload);
      },
    );
  }

  Future<void> showNotification(
      {@required int id, @required String title, @required String body}) async {
    var androidChannelSpecifics = AndroidNotificationDetails(
      'CHANNEL_ID',
      'CHANNEL_NAME',
      'CHANNEL_DESCRIPTION',
      importance: Importance.High,
      priority: Priority.High,
    );
    var iosChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
      androidChannelSpecifics,
      iosChannelSpecifics,
    );
    await flutterLocalNotificationsPlugin.show(id, title, body, platformChannelSpecifics,
        payload: id.toString());
  }

  Future<void> showScheduledNotification(
      {@required int id,
      @required String title,
      @required String body,
      @required String date}) async {
    var scheduledNotificationDateTime = DateTime.parse(date);

    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'your other channel id', 'your other channel name', 'your other channel description');
    var iOSPlatformChannelSpecifics = IOSNotificationDetails();
    NotificationDetails platformChannelSpecifics =
        NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.schedule(
        id, '$title', '  $body', scheduledNotificationDateTime, platformChannelSpecifics,
        androidAllowWhileIdle: true);
  }

  Future<void> removeNotifications() async {
    await flutterLocalNotificationsPlugin.cancelAll();
  }
}

NotificationPlugin notificationPlugin = NotificationPlugin._();
 

и тогда ты сможешь позвонить

 await notificationPlugin.showScheduledNotification(
                id: 123,
                title:"fancy title",
                body: "data",
                date: yourDate,
              );
 

/////////////////////////////////
если вы не будете использовать вспомогательный класс, это просто то, что вам нужно

 var scheduledNotificationDateTime = DateTime.parse(date); // replace whith your date

var androidPlatformChannelSpecifics = AndroidNotificationDetails(
    'your other channel id', 'your other channel name', 'your other channel description');
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
NotificationDetails platformChannelSpecifics =
    NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.schedule(
    id, '$title', '  $body', scheduledNotificationDateTime, platformChannelSpecifics,
    androidAllowWhileIdle: true);
 

Комментарии:

1. Я не вижу, куда передать значение даты и времени… пожалуйста, покажи мне, как это работает

2. Я отредактировал ответ , проверьте его конец,вы передадите свою дату в flutterLocalNotificationsPlugin.schedule(название,текст,дата, канал).

3. я получил 2 ошибки после использования Вашего вспомогательного класса… 1: Неопределенное имя «Платформа». Попробуйте исправить имя на то, которое определено, или определить имя.

4. вторая ошибка связана с заменой моей собственной даты…. var scheduledNotificationDateTime = DateTime.parse(selectedDateAndTime); вот как я ее заменил, но я получаю ошибку: неопределенное имя

5. для платформы просто импортируйте необходимый файл импорта «dart:io»;