Flutter应用角标管理插件app_badge_plus的使用

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

Flutter应用角标管理插件app_badge_plus的使用

插件简介

app_badge_plus 是一个Flutter插件,允许开发者为应用程序图标添加角标(badge)。这些角标通常用于指示未读消息、新通知等信息的数量。

iOS pixel samsung

支持平台

  • iOS
  • Android (包括但不限于以下厂商设备的支持情况)
    • Samsung (pass)
    • Oppo (pass)
    • Vivo (pass)
    • Huawei (pass)
    • Xiaomi
    • LG
    • Sony
    • HTC
    • ZTX

关键特性说明

Android 特性

从Android 8.0(API level 26)开始,通知角标作为一项新功能被引入。用户可以通过长按应用图标来查看通知详情或快捷方式。自Android 13(API level 33)起,在设置应用角标前需请求通知运行时权限。

根据需要支持的系统,在AndroidManifest.xml中添加相应的权限声明:

<!-- 示例:针对不同品牌的权限声明 -->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>
...

iOS 特性

在iOS平台上,启用角标功能同样依赖于通知权限。

权限管理

推荐使用permission_handler包来处理跨平台的通知权限申请。 permission_handler

使用方法

添加依赖

首先,在项目的pubspec.yaml文件中添加app_badge_plus依赖:

dependencies:
  app_badge_plus: ^1.1.2

基本操作示例

以下是基本的操作示例代码,演示如何设置、移除角标以及检查是否支持角标功能:

import 'package:app_badge_plus/app_badge_plus.dart';

// 设置角标数值
AppBadgePlus.updateBadge(5);

// 移除角标
AppBadgePlus.updateBadge(0);

// 检查当前启动器是否支持角标功能
bool isSupported = await AppBadgePlus.isSupported();

完整示例Demo

下面是一个完整的示例项目代码,展示了如何结合flutter_local_notificationspermission_handler来实现通知与角标的动态更新。

main.dart

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

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int count = 0;
  bool isSupported = false;
  bool isNotificationAllowed = false;

  @override
  void initState() {
    super.initState();
    allowNotification();
    AppBadgePlus.isSupported().then((value) {
      isSupported = value;
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('App Badge Plus is supported: $isSupported\n'),
              Text('Notification permission: $isNotificationAllowed\n'),
              TextButton(
                onPressed: () {
                  showNotification();
                },
                child: const Text('Show Notification'),
              ),
              TextButton(
                onPressed: () {
                  count = 0;
                  AppBadgePlus.updateBadge(0);
                },
                child: const Text('Clear Notification'),
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            count += 1;
            AppBadgePlus.updateBadge(count);
          },
          child: const Icon(Icons.add),
        ),
      ),
    );
  }

  void allowNotification() async {
    if (await Permission.notification.isGranted) {
      isNotificationAllowed = true;
      setState(() {});
    } else {
      await Permission.notification.request().then((value) {
        if (value.isGranted) {
          isNotificationAllowed = true;
          setState(() {});
          print('Permission is granted');
        } else {
          print('Permission is not granted');
          isNotificationAllowed = false;
          setState(() {});
        }
      });
    }
  }

  void showNotification() async {
    FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
        FlutterLocalNotificationsPlugin();

    // 初始化插件配置
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('app_icon');
    final DarwinInitializationSettings initializationSettingsDarwin =
        DarwinInitializationSettings(onDidReceiveLocalNotification:
            (int id, String? title, String? body, String? payload) {
      // 回调至UI逻辑
    });
    final InitializationSettings initializationSettings =
        InitializationSettings(
            android: initializationSettingsAndroid,
            iOS: initializationSettingsDarwin,
            macOS: initializationSettingsDarwin);

    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onDidReceiveNotificationResponse: (NotificationResponse details) {},
    );

    const AndroidNotificationDetails androidNotificationDetails =
        AndroidNotificationDetails(
      'your channel id',
      'your channel name',
      channelDescription: 'your channel description',
      importance: Importance.max,
      priority: Priority.high,
      ticker: 'ticker',
      number: 1,
    );
    const NotificationDetails notificationDetails =
        NotificationDetails(android: androidNotificationDetails);
    await flutterLocalNotificationsPlugin.show(
        0, 'plain title', 'plain body', notificationDetails,
        payload: 'item x');
  }
}

通过上述步骤,您可以轻松地将app_badge_plus集成到您的Flutter项目中,并实现对应用角标的管理和控制。希望这对您有所帮助!


更多关于Flutter应用角标管理插件app_badge_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用角标管理插件app_badge_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用app_badge_plus插件来管理应用角标的示例代码。app_badge_plus插件允许你在iOS和Android平台上设置和管理应用图标上的角标(或称为徽章)。

首先,确保你已经在pubspec.yaml文件中添加了app_badge_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  app_badge_plus: ^latest_version  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用app_badge_plus插件。

1. 导入插件

在你的Dart文件中导入app_badge_plus插件:

import 'package:app_badge_plus/app_badge_plus.dart';

2. 请求权限(仅Android)

在Android上设置角标可能需要一些权限,尤其是在Android 8.0(API级别26)及以上版本。确保你的AndroidManifest.xml文件中已经声明了必要的权限。对于角标,通常不需要额外的权限,但如果你需要处理通知,请确保已添加相应的权限。

3. 设置角标

以下是一个简单的示例,展示如何设置和清除应用角标:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('App Badge Plus Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 设置角标为5
                  await AppBadge.updateBadgeCount(5);
                },
                child: Text('Set Badge Count to 5'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 清除角标
                  await AppBadge.removeBadge();
                },
                child: Text('Remove Badge'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 处理平台特定的差异

请注意,不同平台在设置角标时可能会有一些差异。例如,iOS通常允许设置数字角标,而Android则可能支持更复杂的徽章图标(取决于设备和启动器)。

5. 错误处理

在实际应用中,建议添加错误处理逻辑,以处理可能的平台不支持或其他异常情况:

void setBadgeCount(int count) async {
  try {
    await AppBadge.updateBadgeCount(count);
  } catch (e) {
    print('Failed to update badge count: $e');
  }
}

void removeBadge() async {
  try {
    await AppBadge.removeBadge();
  } catch (e) {
    print('Failed to remove badge: $e');
  }
}

将上述函数替换到按钮的onPressed回调中即可。

这样,你就可以在Flutter应用中使用app_badge_plus插件来管理应用角标了。确保在真实设备上测试,因为模拟器可能不完全支持所有角标功能。

回到顶部