Flutter:预定的通知日期时间

Flutter: Scheduled notification datetime

我希望将 Flutter 的插件 date_time_picker 与本地通知集成。

所以当我 select 一个日期和时间时,我也会安排一个通知。

这是我的代码..你能帮我吗?现在我没有任何错误,但代码不工作。

 class test1 extends StatefulWidget {
  @override
  _test1State createState() => _test1State();
}

class _test1State extends State {
  FlutterLocalNotificationsPlugin fltrNotification;
  String _selectedParam;
  String task;
  int val;

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

  Future scheuleAtParticularTime(DateTime timee) async {
    // var time = DateTime(timee.day, timee.month, timee.year, timee.hour,
    //     timee.minute, timee.second);
    var time =
        DateTime(timee.year, timee.month, timee.day, timee.hour, timee.minute);

    var scheduledNotificationDateTime =
        new DateTime.now().add(new Duration(seconds: 5));
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
        'your other channel id',
        'your other channel name',
        'your other channel description');
    var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
    NotificationDetails platformChannelSpecifics = new NotificationDetails(
        android: androidPlatformChannelSpecifics,
        iOS: iOSPlatformChannelSpecifics);
    // tz.initializeTimeZones();
    // tz.setLocalLocation(tz.getLocation('Italy'));
    await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
        scheduledNotificationDateTime, platformChannelSpecifics);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            FlatButton(
              onPressed: () {
                DatePicker.showDateTimePicker(context, showTitleActions: true,
                    onChanged: (date) {
                  print('change $date');
                }, onConfirm: (date) {
                  print('confirm $date');
                  scheuleAtParticularTime(DateTime.fromMillisecondsSinceEpoch(
                      date.millisecondsSinceEpoch));
                }, currentTime: DateTime.now(), locale: LocaleType.it);
              },
              child: Text(
                'Select time for notification arrival',
                style:
                    TextStyle(color: Colors.black, fontWeight: FontWeight.w900),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future notificationSelected(String payload) async {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        content: Text("Notification Clicked $payload"),
      ),
    );
  }
}

谢谢!

ps..我插入了完整的代码,通知有效但随机时间(我从选择器中设置它后大约 5 秒)

假设您已经配置了 AndroidManifest.xml 文件,这是为 Android 设置插件(IOS 没有什么不同),请注意这是针对 3.0 版的。 flutter_local_notifications 的 0 个(我检查时的最新版本)。

首先是帮手 class :

import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;

class NotificationsHelper {

  static final _flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();

//needs an icon
  static final _initializationSettingsAndroid =
      AndroidInitializationSettings('app_icon');

  static final _initializationSettings =
      InitializationSettings(android: _initializationSettingsAndroid);

  static Future<void> init() async {
    await _flutterLocalNotificationsPlugin.initialize(_initializationSettings);
    tz.initializeDatabase([]);
  }

  static final _androidNotificationDetails = AndroidNotificationDetails(
    'channel id',
    'channel name',
    'channel description',
    importance: Importance.max,
    priority: Priority.high,
  );

  static final _notificationDetails =
      NotificationDetails(android: _androidNotificationDetails);

// set Notification methoud
 static Future<void> setNotification(DateTime dateTime, int id) async {
    await _flutterLocalNotificationsPlugin.zonedSchedule(
      id,
      'scheduled title',
      'scheduled body',
      tz.TZDateTime(tz.local, dateTime.year, dateTime.month, dateTime.hour,
          dateTime.minute),
      _notificationDetails,
      androidAllowWhileIdle: true,
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime,
    );
  }

// cancel Notification methoud
 static Future<void> cancelNotification(int id) async {
    await _flutterLocalNotificationsPlugin.cancel(id);
  }
}

AndroidInitializationSettings 需要一个图标,它应该在 android\app\src\main\res\drawable 文件夹中,在可能的情况下,图标名称是 app_icon.png。

主函数中的第二个:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await NotificationsHelper.init();
  runApp(MyApp());
}

这将初始化插件。

现在,您可以在应用的任何位置调用 NotificationsHelper.setNotification() 来设置通知或 NotificationsHelper.cancelNotification() 来取消通知。

ID 应该是唯一的,因为您不能有 2 个或更多具有相同 ID 的预定通知,您添加的最后一个通知将替换旧的。

好的,我找到问题了:

await fltrNotification.schedule(1, 'scheduled title', 'scheduled body', timee, platformChannelSpecifics);

而不是

await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
        scheduledNotificationDateTime, platformChannelSpecifics);

您可以使用内置的 class 来安排带有日期和时间的通知。您可以查看以下代码以更好地理解。

Future<void> scheduleNotification() async {

    var scheduledNotificationDateTime =
    DateTime(2021,10,11,1,17,0); //Here you can set your custom Date&Time

    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
      'channel id',
      'channel name',
      'channel description',
      icon: 'flutter_devs',
      largeIcon: DrawableResourceAndroidBitmap('flutter_devs'),
    );
    var iOSPlatformChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.schedule(
        0,
        'scheduled title',
        'scheduled body',
        scheduledNotificationDateTime,
        platformChannelSpecifics);
  }