Flutter本地通知接口插件flutter_local_notifications_platform_interface的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter本地通知接口插件flutter_local_notifications_platform_interface的使用

简介

flutter_local_notifications_platform_interfaceflutter_local_notifications 插件的通用平台接口。它允许开发者为不同的平台(如Android、iOS等)实现特定的通知功能。

使用方法

引入依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^13.0.0

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

初始化和配置

创建FlutterLocalNotificationsPlugin实例

你需要创建一个 FlutterLocalNotificationsPlugin 实例来管理通知:

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

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

  // 初始化通知插件
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  // 设置初始化设置
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
  );

  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  runApp(MyApp(flutterLocalNotificationsPlugin));
}

定义平台特定实现

如果你需要自定义平台特定的行为,可以通过继承 FlutterLocalNotificationsPlatform 类来实现:

class MyFlutterLocalNotificationsPlatform extends FlutterLocalNotificationsPlatform {
  @override
  Future<void> initialize(InitializationSettings initializationSettings, Function onSelectNotification) async {
    // 自定义初始化逻辑
    return super.initialize(initializationSettings, onSelectNotification);
  }

  // 其他自定义方法...
}

// 注册自定义实现
FlutterLocalNotificationsPlatform.instance = MyFlutterLocalNotificationsPlatform();

发送本地通知

基本通知

你可以通过 show 方法发送一个简单的本地通知:

class MyApp extends StatelessWidget {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  MyApp(this.flutterLocalNotificationsPlugin);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Local Notifications')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              await flutterLocalNotificationsPlugin.show(
                0,
                'Plain Title',
                'Plain body',
                NotificationDetails(
                  android: AndroidNotificationDetails(
                    'channel id',
                    'channel name',
                    channelDescription: 'channel description',
                    importance: Importance.max,
                    priority: Priority.high,
                    showWhen: false,
                  ),
                ),
              );
            },
            child: Text('Show notification'),
          ),
        ),
      ),
    );
  }
}

定时通知

你还可以设置定时通知,比如在5秒后触发:

await flutterLocalNotificationsPlugin.zonedSchedule(
  0,
  'scheduled title',
  'scheduled body',
  tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)),
  NotificationDetails(
    android: AndroidNotificationDetails(
      'your channel id',
      'your channel name',
      channelDescription: 'your channel description',
    ),
  ),
  androidAllowWhileIdle: true,
  uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
);

处理通知点击事件

你可以监听通知点击事件,并执行相应的操作:

Future<void> _onSelectNotification(String payload) async {
  if (payload != null) {
    debugPrint('notification payload: $payload');
  }
  // 打开新的页面或执行其他操作
}

final InitializationSettings initializationSettings = InitializationSettings(
  android: initializationSettingsAndroid,
  onSelectNotification: _onSelectNotification,
);

完整示例代码

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

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

  // 初始化时区数据
  tz.initializeTimeZones();

  // 初始化通知插件
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

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

  final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    onSelectNotification: _onSelectNotification,
  );

  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  runApp(MyApp(flutterLocalNotificationsPlugin));
}

Future<void> _onSelectNotification(String payload) async {
  if (payload != null) {
    debugPrint('notification payload: $payload');
  }
  // 打开新的页面或执行其他操作
}

class MyApp extends StatelessWidget {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  MyApp(this.flutterLocalNotificationsPlugin);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Local Notifications')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  await flutterLocalNotificationsPlugin.show(
                    0,
                    'Plain Title',
                    'Plain body',
                    NotificationDetails(
                      android: AndroidNotificationDetails(
                        'channel id',
                        'channel name',
                        channelDescription: 'channel description',
                        importance: Importance.max,
                        priority: Priority.high,
                        showWhen: false,
                      ),
                    ),
                  );
                },
                child: Text('Show notification'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  await flutterLocalNotificationsPlugin.zonedSchedule(
                    0,
                    'scheduled title',
                    'scheduled body',
                    tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)),
                    NotificationDetails(
                      android: AndroidNotificationDetails(
                        'your channel id',
                        'your channel name',
                        channelDescription: 'your channel description',
                      ),
                    ),
                    androidAllowWhileIdle: true,
                    uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
                  );
                },
                child: Text('Show scheduled notification'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个完整的示例展示了如何使用 flutter_local_notifications 插件来发送基本和定时通知,并处理通知点击事件。希望这对你有所帮助!


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_local_notifications_platform_interface插件来实现本地通知的示例代码。需要注意的是,flutter_local_notifications_platform_interface本身是一个接口层,它通常与具体的实现插件如flutter_local_notifications一起使用。

首先,确保你的Flutter项目已经添加了必要的依赖项。你需要在pubspec.yaml文件中添加flutter_local_notifications依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^x.y.z  # 请替换为最新版本号

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

接下来,你需要配置Android和iOS平台的相关设置。对于Android,你需要在android/app/src/main/AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

对于iOS,你需要在ios/Runner/Info.plist中添加请求通知权限的声明:

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>NSAppleMusicUsageDescription</key>
<string>We need your permission to use Apple Music</string>
<key>NSUserNotificationAlertStyle</key>
<string>alert</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We need your location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location</string>
<key>UNNotificationSoundStyle</key>
<string>default</string>

接下来是具体的代码实现。首先,在lib目录下创建一个新的Dart文件,比如notification_service.dart,并添加以下代码:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class NotificationService {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  NotificationService({required this.flutterLocalNotificationsPlugin});

  Future<void> initialize() async {
    const initializationSettings = InitializationSettings(
      android: AndroidInitializationSettings('@mipmap/ic_launcher'),
      iOS: IOSInitializationSettings(
        onDidReceiveLocalNotification: onDidReceiveLocalNotification,
      ),
    );

    await flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }

  Future<void> showNotification({
    required int id,
    required String title,
    required String body,
    required DateTime dateTime,
  }) async {
    const notificationDetails = NotificationDetails(
      android: AndroidNotificationDetails(
        channelId: 'channel_id',
        channelName: 'Channel name',
        channelDescription: 'Channel description',
        icon: '@mipmap/ic_launcher',
      ),
      iOS: IOSNotificationDetails(
        presentAlert: true,
        presentSound: true,
      ),
    );

    await flutterLocalNotificationsPlugin.schedule(
      Notification(
        id: id,
        title: title,
        body: body,
        notificationLayout: NotificationLayout.BigTextStyle,
      ),
      dateTime,
      notificationDetails,
    );
  }

  Future<void> onSelectNotification(String? payload) async {
    if (payload != null) {
      // 处理通知点击事件
      debugPrint('Notification payload: $payload');
    }
  }

  Future<void> onDidReceiveLocalNotification(
      int id, String? title, String? body, String? payload) async {
    // 处理接收到本地通知时的逻辑
    debugPrint('onDidReceiveLocalNotification: $id, $title, $body, $payload');
  }
}

然后,在你的主应用文件(比如main.dart)中初始化并使用这个服务:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
  FlutterLocalNotificationsPlugin();

  final NotificationService notificationService = NotificationService(
    flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin,
  );

  runApp(MyApp(notificationService: notificationService));
}

class MyApp extends StatelessWidget {
  final NotificationService notificationService;

  MyApp({required this.notificationService});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Local Notifications Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              await notificationService.initialize();
              await notificationService.showNotification(
                id: 0,
                title: 'Hello',
                body: 'This is a local notification',
                dateTime: DateTime.now().add(Duration(seconds: 5)),
              );
            },
            child: Text('Show Notification'),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何初始化本地通知插件、配置通知渠道、调度一个本地通知,并处理通知点击事件。请确保替换@mipmap/ic_launcher为你自己的应用图标资源。

注意:flutter_local_notifications_platform_interface本身是一个低级别的接口,通常你不需要直接与其交互,而是通过flutter_local_notifications这样的高层级插件来使用其功能。

回到顶部