Flutter本地通知插件flutter_local_notifications_change的使用

Flutter本地通知插件flutter_local_notifications的使用

flutter_local_notifications 是一个强大的 Flutter 插件,用于在应用程序中实现本地通知。本文将展示如何使用该插件来发送本地通知。

环境配置

首先,确保你的项目已经添加了 flutter_local_notifications 依赖项。你可以在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^9.0.0 # 请根据最新版本进行更新

然后运行 flutter pub get 来安装依赖。

初始化

在使用插件之前,你需要初始化 flutter_local_notifications。在 main.dart 文件中添加以下代码:

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建一个 FlutterLocalNotificationsPlugin 实例
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  // 配置初始化参数
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  
  // 对于 iOS 和 macOS,可以添加类似的初始化设置
  const DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings();
  
  const InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin,
  );
  
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  runApp(MyApp(flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin));
}

发送本地通知

接下来,我们将展示如何发送一条本地通知。在 MyApp 类中添加以下方法:

class MyApp extends StatelessWidget {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  MyApp({required this.flutterLocalNotificationsPlugin});

  void showNotification() async {
    // 构建一个 Android 通道 ID
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
            'your channel id', 'your channel name', 'your channel description',
            importance: Importance.max,
            priority: Priority.high,
            showWhen: false);
    
    // 构建一个通用的通知详情对象
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);

    // 显示通知
    await flutterLocalNotificationsPlugin.show(
        0, '普通通知标题', '这是通知内容', platformChannelSpecifics,
        payload: 'item x');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('本地通知示例')),
        body: Center(
          child: ElevatedButton(
            onPressed: showNotification,
            child: Text('发送通知'),
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们创建了一个按钮,当点击按钮时会调用 showNotification() 方法来发送一条本地通知。

完整示例代码

下面是完整的 main.dart 文件代码:

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建一个 FlutterLocalNotificationsPlugin 实例
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  // 配置初始化参数
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  
  // 对于 iOS 和 macOS,可以添加类似的初始化设置
  const DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings();
  
  const InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin,
  );
  
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  runApp(MyApp(flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin));
}

class MyApp extends StatelessWidget {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  MyApp({required this.flutterLocalNotificationsPlugin});

  void showNotification() async {
    // 构建一个 Android 通道 ID
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
            'your channel id', 'your channel name', 'your channel description',
            importance: Importance.max,
            priority: Priority.high,
            showWhen: false);
    
    // 构建一个通用的通知详情对象
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);

    // 显示通知
    await flutterLocalNotificationsPlugin.show(
        0, '普通通知标题', '这是通知内容', platformChannelSpecifics,
        payload: 'item x');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('本地通知示例')),
        body: Center(
          child: ElevatedButton(
            onPressed: showNotification,
            child: Text('发送通知'),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter本地通知插件flutter_local_notifications_change的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地通知插件flutter_local_notifications_change的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_local_notifications 是一个流行的 Flutter 插件,用于在移动设备上显示本地通知。通过这个插件,你可以在 Android 和 iOS 上调度和显示通知。下面是如何使用 flutter_local_notifications 插件的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_local_notifications 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^x.x.x # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化插件

在你的 Dart 文件中导入插件并初始化它。

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化设置
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');

  final DarwinInitializationSettings initializationSettingsDarwin =
      DarwinInitializationSettings(
    onDidReceiveLocalNotification: onDidReceiveLocalNotification,
  );

  final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin,
  );

  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  runApp(MyApp());
}

void onDidReceiveLocalNotification(
    int id, String? title, String? body, String? payload) {
  // 处理通知点击事件
}

3. 显示通知

你可以使用 flutterLocalNotificationsPlugin.show 方法来显示通知。

Future<void> showNotification() async {
  const AndroidNotificationDetails androidPlatformChannelSpecifics =
      AndroidNotificationDetails(
    'your channel id',
    'your channel name',
    importance: Importance.max,
    priority: Priority.high,
  );

  const DarwinNotificationDetails iOSPlatformChannelSpecifics =
      DarwinNotificationDetails();

  const NotificationDetails platformChannelSpecifics = NotificationDetails(
    android: androidPlatformChannelSpecifics,
    iOS: iOSPlatformChannelSpecifics,
  );

  await flutterLocalNotificationsPlugin.show(
    0, // 通知ID
    'Notification Title', // 标题
    'Notification Body', // 内容
    platformChannelSpecifics,
    payload: 'data', // 可选的有效负载
  );
}

4. 调度通知

你可以使用 flutterLocalNotificationsPlugin.zonedSchedule 方法来调度通知。

Future<void> scheduleNotification() async {
  const AndroidNotificationDetails androidPlatformChannelSpecifics =
      AndroidNotificationDetails(
    'your channel id',
    'your channel name',
    importance: Importance.max,
    priority: Priority.high,
  );

  const DarwinNotificationDetails iOSPlatformChannelSpecifics =
      DarwinNotificationDetails();

  const NotificationDetails platformChannelSpecifics = NotificationDetails(
    android: androidPlatformChannelSpecifics,
    iOS: iOSPlatformChannelSpecifics,
  );

  await flutterLocalNotificationsPlugin.zonedSchedule(
    1, // 通知ID
    'Scheduled Notification', // 标题
    'This is a scheduled notification', // 内容
    tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)), // 调度时间
    platformChannelSpecifics,
    androidAllowWhileIdle: true,
    uiLocalNotificationDateInterpretation:
        UILocalNotificationDateInterpretation.absoluteTime,
    payload: 'data', // 可选的有效负载
  );
}

5. 处理通知点击

你可以在 initialize 方法中设置 onSelectNotification 回调来处理通知点击事件。

await flutterLocalNotificationsPlugin.initialize(
  initializationSettings,
  onDidReceiveNotificationResponse: (NotificationResponse response) {
    // 处理通知点击事件
    print('Notification clicked: ${response.payload}');
  },
);

6. 取消通知

你可以使用 flutterLocalNotificationsPlugin.cancel 方法来取消特定的通知,或者使用 flutterLocalNotificationsPlugin.cancelAll 方法来取消所有通知。

// 取消特定通知
await flutterLocalNotificationsPlugin.cancel(0);

// 取消所有通知
await flutterLocalNotificationsPlugin.cancelAll();

7. 自定义通知图标和声音

你可以在 AndroidNotificationDetailsDarwinNotificationDetails 中自定义通知的图标、声音等。

const AndroidNotificationDetails androidPlatformChannelSpecifics =
    AndroidNotificationDetails(
  'your channel id',
  'your channel name',
  icon: 'custom_icon', // 自定义图标
  sound: RawResourceAndroidNotificationSound('custom_sound'), // 自定义声音
  importance: Importance.max,
  priority: Priority.high,
);

const DarwinNotificationDetails iOSPlatformChannelSpecifics =
    DarwinNotificationDetails(
  sound: 'custom_sound.aiff', // 自定义声音
);

8. 处理权限

在 Android 上,通常不需要额外的权限。但在 iOS 上,你需要在 Info.plist 文件中添加通知权限:

<key>NSLocalNotificationUsageDescription</key>
<string>We need to send you notifications</string>

9. 处理后台通知

如果你需要在应用处于后台时处理通知,你可以使用 flutter_local_notificationsonDidReceiveNotificationResponse 回调来处理。

10. 处理时区

如果你需要处理时区相关的问题,可以使用 timezone 包来处理时区。

import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;

void main() {
  tz.initializeTimeZones();
  runApp(MyApp());
}
回到顶部