Flutter中如何使用flutterlocalnotificationsplugin插件

在Flutter项目中集成flutterlocalnotificationsplugin插件时遇到问题,具体步骤如下:

  1. 已按照pub.dev文档添加依赖并同步
  2. 在AndroidManifest.xml中配置了权限
  3. 初始化插件时调用initialize方法

但测试时始终无法触发本地通知,日志也没有报错信息。请问:

  • 是否需要额外配置通知渠道?
  • Android 8.0以上和以下版本的处理方式有差异吗?
  • 能否提供完整的初始化代码示例?

(环境:Flutter 3.13.0,插件版本9.8.0)

2 回复

在Flutter中使用flutter_local_notifications插件,步骤如下:

  1. 添加依赖:在pubspec.yaml中添加flutter_local_notifications: ^版本号,运行flutter pub get

  2. Android配置

    • android/app/src/main/AndroidManifest.xml添加权限:
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    
    • 创建通知渠道(Android 8.0+必需)
  3. iOS配置

    • ios/Runner/Info.plist添加权限描述
  4. 初始化插件

final FlutterLocalNotificationsPlugin notificationsPlugin = 
    FlutterLocalNotificationsPlugin();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  const AndroidInitializationSettings androidSettings = 
      AndroidInitializationSettings('@mipmap/ic_launcher');
  const DarwinInitializationSettings iosSettings = 
      DarwinInitializationSettings();
  
  final InitializationSettings settings = 
      InitializationSettings(android: androidSettings, iOS: iosSettings);
  
  await notificationsPlugin.initialize(settings);
}
  1. 显示通知
await notificationsPlugin.show(
  0,
  '通知标题',
  '通知内容',
  NotificationDetails(
    android: AndroidNotificationDetails(
      'channel_id',
      'channel_name',
      importance: Importance.max,
    ),
    iOS: DarwinNotificationDetails(),
  ),
);

记得处理权限请求,特别是在Android 13+和iOS 10+系统上。

更多关于Flutter中如何使用flutterlocalnotificationsplugin插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用flutter_local_notifications插件实现本地通知,步骤如下:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  flutter_local_notifications: ^16.3.0

运行 flutter pub get 安装。

2. 配置平台设置

Android

  • android/app/src/main/AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
  • 创建通知图标(可选),在 android/app/src/main/res/drawable 放置图标文件。

iOS

  • ios/Runner/Info.plist 中添加权限描述:
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIUserNotificationSettings</key>
<array></array>

3. 初始化插件

main.dart 中初始化:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化设置
  const AndroidInitializationSettings androidSettings =
      AndroidInitializationSettings('@mipmap/ic_launcher'); // 默认图标
  const DarwinInitializationSettings iosSettings =
      DarwinInitializationSettings();
  const InitializationSettings initSettings = InitializationSettings(
    android: androidSettings,
    iOS: iosSettings,
  );
  
  await flutterLocalNotificationsPlugin.initialize(
    initSettings,
    onDidReceiveNotificationResponse: (NotificationResponse response) {
      // 处理通知点击
      print('通知被点击: ${response.payload}');
    },
  );
  
  runApp(MyApp());
}

4. 请求通知权限(Android 13+ 和 iOS)

// 在需要的地方调用
await flutterLocalNotificationsPlugin
    .resolvePlatformSpecificImplementation<
        AndroidFlutterLocalNotificationsPlugin>()
    ?.requestPermission(); // Android 13+

// iOS 权限请求在初始化时自动触发,可通过配置控制

5. 显示通知

Future<void> showNotification() async {
  const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
    'channel_id', // 通道ID
    '频道名称',      // 通道名称
    channelDescription: '频道描述',
    importance: Importance.max,
    priority: Priority.high,
  );
  const DarwinNotificationDetails iosDetails = DarwinNotificationDetails();
  const NotificationDetails details = NotificationDetails(
    android: androidDetails,
    iOS: iosDetails,
  );
  
  await flutterLocalNotificationsPlugin.show(
    0, // 通知ID
    '通知标题',
    '通知内容',
    details,
    payload: '附加数据', // 点击通知时传递的数据
  );
}

6. 定时通知(可选)

// 每天固定时间触发
await flutterLocalNotificationsPlugin.zonedSchedule(
  1,
  '定时通知',
  '这是预定时间的通知',
  tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)), // 5秒后
  const NotificationDetails(/* 配置同上 */),
  uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
  matchDateTimeComponents: DateTimeComponents.time, // 每天同一时间
);

7. 取消通知

// 取消特定ID的通知
await flutterLocalNotificationsPlugin.cancel(0);
// 取消所有通知
await flutterLocalNotificationsPlugin.cancelAll();

注意事项:

  • Android:从 Android 8.0 开始必须创建通知通道。
  • iOS:需在真实设备上测试,模拟器可能无法正常显示。
  • 处理点击事件通过 initialize 中的 onDidReceiveNotificationResponse 回调。

通过以上步骤即可在Flutter应用中实现本地通知功能。

回到顶部