Flutter通知渠道管理插件notification_channel_manager的使用

Flutter通知渠道管理插件notification_channel_manager的使用

notification_channel_manager 是一个用于管理和操作 Android 通知渠道(NotificationChannels)和通知渠道组(NotificationChannelGroups)的插件。此插件支持创建、读取、更新和删除通知渠道及渠道组的功能。

有用的链接

需要注意的事项

  • 通知渠道是 Android 8.0 (API 级别 26) 及以上版本的功能。如果您的应用针对的是更旧版本的 Android,则不会抛出错误,但该插件将不会执行任何操作。
  • 删除通知渠道是软删除,如果再次创建具有相同 id 的通知渠道,它会被恢复,并保留与旧渠道相同的设置。详情参见这里
  • 删除通知渠道组将会删除该组内的所有通知渠道。
  • 通知设置屏幕会显示已删除的通知渠道的数量,作为反垃圾邮件机制的一部分。您可以通过重新安装应用或清除与应用相关的数据来清除开发设备上的测试渠道。
  • 创建通知渠道后,只能更新名称、描述和重要性。
  • 已存在的通知渠道的重要性只有在新重要性低于当前值且用户尚未更改该渠道的任何设置时才会被更改。
  • 请务必查阅 Android 文档以获取更多信息。

路线图

必需的功能

  • 创建通知渠道
  • 创建通知渠道组
  • 更新通知渠道
  • 更新通知渠道组
  • 删除通知渠道
  • 删除通知渠道组
  • 读取通知渠道
  • 读取通知渠道组

Dart 方面

  • 定义 NotificationChannelNotificationChannelGroup
  • 定义 NotificationChannelManager
  • 定义 NotificationChannelManager 使用的原生 API 接口

Android 方面

  • 实现原生 API 功能

添加测试

  • 当前的测试不稳定,需要重写。多个测试依赖于彼此。更好的方法是在原生端创建一个测试套件,然后为 Dart 端模拟这些测试。这将在下一个迭代中完成。

设置示例应用

编写文档

贡献指南

本项目是开源的。非常欢迎贡献!

文档

正在编写中…

完整示例 Demo

以下是一个完整的示例,演示如何使用 notification_channel_manager 插件来创建、读取、更新和删除通知渠道和渠道组。

import 'package:flutter/material.dart';
import 'package:notification_channel_manager/notification_channel_manager.dart'; // 导入插件

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final NotificationChannelManager _channelManager = NotificationChannelManager();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化时创建通知渠道
    _createNotificationChannel();
  }

  Future<void> _createNotificationChannel() async {
    try {
      // 创建通知渠道
      await _channelManager.createNotificationChannel(
        id: "my_channel_id",
        name: "My Channel",
        description: "This is my custom channel",
        importance: Importance.defaultImportance,
      );

      // 读取并打印通知渠道信息
      final channels = await _channelManager.getNotificationChannels();
      print("Notification Channels: $channels");

    } catch (e) {
      print("Error creating notification channel: $e");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Notification Channel Manager Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 更新通知渠道
              await _channelManager.updateNotificationChannel(
                id: "my_channel_id",
                name: "Updated Channel",
                description: "This is an updated channel",
                importance: Importance.max,
              );

              // 删除通知渠道
              await _channelManager.deleteNotificationChannel(id: "my_channel_id");
            },
            child: const Text("Create & Update Notification Channel"),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


notification_channel_manager 是一个用于管理 Android 通知渠道的 Flutter 插件。它允许开发者在 Flutter 应用中创建、更新和删除通知渠道。以下是如何使用该插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  notification_channel_manager: ^1.0.0  # 请检查最新版本

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

2. 导入插件

在需要使用通知渠道管理的 Dart 文件中导入插件:

import 'package:notification_channel_manager/notification_channel_manager.dart';

3. 创建通知渠道

你可以使用 NotificationChannelManager 来创建通知渠道。以下是一个示例:

void createNotificationChannel() async {
  NotificationChannel channel = NotificationChannel(
    id: 'channel_id', // 通知渠道的唯一标识符
    name: 'Channel Name', // 通知渠道的名称
    description: 'Channel Description', // 通知渠道的描述
    importance: NotificationImportance.High, // 通知的重要性级别
    showBadge: true, // 是否显示应用图标上的徽章
    enableVibration: true, // 是否启用振动
    enableLights: true, // 是否启用指示灯
    sound: 'sound.mp3', // 通知声音(可选)
  );

  await NotificationChannelManager.createNotificationChannel(channel);
}

4. 更新通知渠道

你可以更新已存在的通知渠道:

void updateNotificationChannel() async {
  NotificationChannel channel = NotificationChannel(
    id: 'channel_id', // 需要更新的通知渠道的标识符
    name: 'Updated Channel Name', // 更新后的名称
    description: 'Updated Channel Description', // 更新后的描述
    importance: NotificationImportance.Default, // 更新后的重要性级别
    showBadge: false, // 更新后的徽章显示状态
    enableVibration: false, // 更新后的振动状态
    enableLights: false, // 更新后的指示灯状态
    sound: 'updated_sound.mp3', // 更新后的通知声音(可选)
  );

  await NotificationChannelManager.updateNotificationChannel(channel);
}

5. 删除通知渠道

你可以删除不再需要的通知渠道:

void deleteNotificationChannel() async {
  await NotificationChannelManager.deleteNotificationChannel('channel_id');
}

6. 获取通知渠道

你可以获取已存在的通知渠道:

void getNotificationChannel() async {
  NotificationChannel? channel = await NotificationChannelManager.getNotificationChannel('channel_id');
  if (channel != null) {
    print('Channel Name: ${channel.name}');
    print('Channel Description: ${channel.description}');
  }
}

7. 获取所有通知渠道

你可以获取所有已存在的通知渠道:

void getAllNotificationChannels() async {
  List<NotificationChannel> channels = await NotificationChannelManager.getAllNotificationChannels();
  for (var channel in channels) {
    print('Channel ID: ${channel.id}, Name: ${channel.name}');
  }
}

8. 处理权限

在 Android 8.0(API 级别 26)及以上版本中,通知渠道的管理需要适当的权限。确保在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>

9. 处理兼容性

请注意,通知渠道功能仅在 Android 8.0(API 级别 26)及以上版本中可用。在使用插件时,建议检查 Android 版本以确保兼容性。

if (Platform.isAndroid && await NotificationChannelManager.isNotificationChannelSupported()) {
  // 执行通知渠道相关操作
}

10. 示例代码

以下是一个完整的示例,展示了如何使用 notification_channel_manager 插件:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Notification Channel Manager Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: createNotificationChannel,
                child: Text('Create Notification Channel'),
              ),
              ElevatedButton(
                onPressed: updateNotificationChannel,
                child: Text('Update Notification Channel'),
              ),
              ElevatedButton(
                onPressed: deleteNotificationChannel,
                child: Text('Delete Notification Channel'),
              ),
              ElevatedButton(
                onPressed: getNotificationChannel,
                child: Text('Get Notification Channel'),
              ),
              ElevatedButton(
                onPressed: getAllNotificationChannels,
                child: Text('Get All Notification Channels'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void createNotificationChannel() async {
    NotificationChannel channel = NotificationChannel(
      id: 'channel_id',
      name: 'Channel Name',
      description: 'Channel Description',
      importance: NotificationImportance.High,
      showBadge: true,
      enableVibration: true,
      enableLights: true,
      sound: 'sound.mp3',
    );

    await NotificationChannelManager.createNotificationChannel(channel);
  }

  void updateNotificationChannel() async {
    NotificationChannel channel = NotificationChannel(
      id: 'channel_id',
      name: 'Updated Channel Name',
      description: 'Updated Channel Description',
      importance: NotificationImportance.Default,
      showBadge: false,
      enableVibration: false,
      enableLights: false,
      sound: 'updated_sound.mp3',
    );

    await NotificationChannelManager.updateNotificationChannel(channel);
  }

  void deleteNotificationChannel() async {
    await NotificationChannelManager.deleteNotificationChannel('channel_id');
  }

  void getNotificationChannel() async {
    NotificationChannel? channel = await NotificationChannelManager.getNotificationChannel('channel_id');
    if (channel != null) {
      print('Channel Name: ${channel.name}');
      print('Channel Description: ${channel.description}');
    }
  }

  void getAllNotificationChannels() async {
    List<NotificationChannel> channels = await NotificationChannelManager.getAllNotificationChannels();
    for (var channel in channels) {
      print('Channel ID: ${channel.id}, Name: ${channel.name}');
    }
  }
}
回到顶部