import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;

class LocalNotificationsService {
  int id = 0;
  LocalNotificationsService._();

  static final _instance = LocalNotificationsService._();

  factory LocalNotificationsService() => _instance;

  FlutterLocalNotificationsPlugin? _flutterLocalNotificationsPlugin;

  Future selectNotification(String? payload) async {
    // 处理通知点击事件
    if (payload != null) {
      debugPrint('notification payload: ' + payload);
    }
  }

  Future<FlutterLocalNotificationsPlugin> initialize() async {
    // 初始化插件
    _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

    // 配置插件
    // 配置Android初始化设置
    const AndroidInitializationSettings androidInitializationSettings =
        AndroidInitializationSettings('icon_notification');
    // 配置iOS和macOS的初始化设置
    const DarwinInitializationSettings darwinInitializationSettings =
        DarwinInitializationSettings();
    // 配置Linux的初始化设置
    const LinuxInitializationSettings linuxInitializationSettings =
        LinuxInitializationSettings(defaultActionName: 'default_action');
    // 配置所有平台的初始化设置
    const InitializationSettings initializationSettings =
        InitializationSettings(
      android: androidInitializationSettings,
      iOS: darwinInitializationSettings,
      macOS: darwinInitializationSettings,
      linux: linuxInitializationSettings,
    );

    // 使用配置初始化插件
    await _flutterLocalNotificationsPlugin!.initialize(
      initializationSettings,
      onDidReceiveNotificationResponse: (NotificationResponse response) {
        // 处理通知点击事件
        debugPrint('notification payload: ' + response.payload!);
      },
    );

    return _flutterLocalNotificationsPlugin!;
  }

  Future<void> showNotification({
    required String title,
    required String body,
    String? payload,
  }) async {
    id += 1;
    // 显示通知
    // 创建Android通知的详细设置
    const AndroidNotificationDetails androidNotificationDetails =
        AndroidNotificationDetails('your channel id', 'your channel name',
            channelDescription: 'your channel description', // 频道的描述。
            importance: Importance.max, // 通知的重要性。
            priority: Priority.high, // 通知的优先级。
            ticker: 'ticker'); // 通知的提示文本。

    // 创建通知渠道
    // const AndroidNotificationChannel channel = AndroidNotificationChannel(
    //   'my_notification_channel', // id
    //   'My Notifications', // title
    //   //   'This channel is used for my notifications.', // description
    //   importance: Importance.max,
    // );
    // 创建通知的详细设置
    const NotificationDetails notificationDetails =
        NotificationDetails(android: androidNotificationDetails); // 创建通知
    // 显示通知
    await _flutterLocalNotificationsPlugin!.show(
      id, // 通知的 ID。
      title, // 通知的标题。
      body, // 通知的内容。
      notificationDetails, // 通知的详细设置。
      payload: payload, // 通知的数据。
    );
  }

  Future<void> scheduleNotification({
    required String title,
    required String body,
    required tz.TZDateTime scheduledDate,
  }) async {
    // 安排通知
    // 定义本地通知的Android通知详细信息。
    const AndroidNotificationDetails androidNotificationDetails =
        AndroidNotificationDetails('your channel id', 'your channel name',
            channelDescription: 'your channel description',
            importance: Importance.max,
            priority: Priority.high,
            ticker: 'ticker');

    // 定义本地通知的详细信息。
    const NotificationDetails notificationDetails =
        NotificationDetails(android: androidNotificationDetails);

    // 使用Flutter Local Notifications插件安排本地通知。
    await _flutterLocalNotificationsPlugin!.zonedSchedule(
      0, // 通知的ID。
      title, // 通知的标题。
      body, // 通知的正文。
      scheduledDate, // 应安排通知的日期和时间。
      notificationDetails, // 通知的详细信息。
      androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle, // 安排模式。
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime, // 日期解释。
    );
  }

  // 在这里添加更多不同类型的通知方法
  // 例如:showImageNotification、showProgressNotification、showGroupNotification、addActionButtons等等
}



// // 安排通知
//     final tz.TZDateTime scheduledDate =
//         tz.TZDateTime.now(tz.local).add(Duration(seconds: 5));
//     LocalNotificationsService().scheduleNotification(
//       title: '安排通知标题',
//       body: '安排通知内容',
//       scheduledDate: scheduledDate,
//     );

调用方式:


  Future<FlutterLocalNotificationsPlugin> setupLocalNotifications() async {
    // 初始化服务
    FlutterLocalNotificationsPlugin localNoti =
        await LocalNotificationsService().initialize();

    developer.log('Local Notifications setup completed');

    return localNoti;
  }
最后修改:2024 年 05 月 23 日
如果觉得我的文章对你有用,请随意赞赏