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

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

BadgeManager 是一个用于设置角标的工具,目前支持iOS和Android(包括三星、华为、小米等)。如果需要其他功能,可以在现有基础上进行扩展。

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  badge_manager: lastest version

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

简单使用

以下是一个完整的示例,展示了如何使用 badge_manager 插件来设置和移除角标。

import 'dart:ui';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:badge_manager/badge_manager.dart';
import 'package:fluttertoast/fluttertoast.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> with WidgetsBindingObserver {

  late TextEditingController controller;

  String brandStr = "";
  String supported = "";

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch (state) {
      case AppLifecycleState.inactive: // 应用处于暂停状态
        break;
      case AppLifecycleState.resumed: // 应用从后台切换到前台
        break;
      case AppLifecycleState.paused: // 应用在后台
        setBadge();
        break;
      case AppLifecycleState.detached: // 应用结束
        break;
    }
  }

  [@override](/user/override)
  void initState() {
    WidgetsBinding.instance?.addObserver(this);
    controller = TextEditingController();
    super.initState();
  }

  /// 是否支持设置角标
  void isSupported() async {
    final bool value = await BadgeManager.isSupportedBadge();
    setState(() {
      supported = value ? "true" : "false";
    });
  }

  /// 获取手机品牌
  void getBrand() async {
    final String brand = await BadgeManager.getBrand();
    setState(() {
      brandStr = brand;
    });
  }

  /// 设置角标
  void setBadge() async {
    await BadgeManager.setBadge(count: int.parse(controller.text), title: "通知", content: "this is content");
  }

  /// 移除角标
  void removeBadge() async {
    await BadgeManager.removeBadge();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: const Text('BadgeManager'),
        ),
        resizeToAvoidBottomInset: false,
        body: InkWell(
          child: SafeArea(
            child: SingleChildScrollView(
              child: SizedBox(
                child: Container(
                  alignment: Alignment.center,
                  color: Colors.white,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      const Padding(padding: EdgeInsets.only(top: 30)),
                      Text("是否支持:" + supported),
                      const Padding(padding: EdgeInsets.only(top: 30)),
                      InkWell(
                        child: Container(
                          decoration: BoxDecoration(
                            boxShadow:  [
                              BoxShadow(
                                color: Colors.black.withOpacity(0.2),
                                offset: const Offset(0, 1),
                                blurRadius: 1.5,
                                spreadRadius: 2.5,
                              ),
                            ],
                            color: Colors.green,
                            borderRadius: BorderRadius.circular(8.0),
                          ),
                          alignment: Alignment.center,
                          height: 50,
                          width: 300,
                          child: const Text("点击查看是否支持",
                            style: TextStyle(
                              color: Colors.white,
                              fontWeight: FontWeight.bold,
                              fontSize: 18,
                            ),
                          ),
                        ),
                        onTap: () {
                          FocusScope.of(context).requestFocus(FocusNode());
                          isSupported();
                        },
                      ),

                      const Padding(padding: EdgeInsets.only(top: 30)),
                      Text("手机品牌:" + brandStr),
                      const Padding(padding: EdgeInsets.only(top: 30)),
                      InkWell(
                        child: Container(
                          decoration: BoxDecoration(
                            boxShadow:  [
                              BoxShadow(
                                color: Colors.black.withOpacity(0.2),
                                offset: const Offset(0, 1),
                                blurRadius: 1.5,
                                spreadRadius: 2.5,
                              ),
                            ],
                            color: Colors.orange,
                            borderRadius: BorderRadius.circular(8.0),
                          ),
                          alignment: Alignment.center,
                          height: 50,
                          width: 300,
                          child: const Text("点击获取手机品牌",
                            style: TextStyle(
                              color: Colors.white,
                              fontWeight: FontWeight.bold,
                              fontSize: 18,
                            ),
                          ),
                        ),
                        onTap: () {
                          FocusScope.of(context).requestFocus(FocusNode());
                          getBrand();
                        },
                      ),

                      const Padding(padding: EdgeInsets.only(top: 30)),
                      SizedBox(
                        height: 50,
                        width: 300,
                        child: CupertinoTextField(
                          controller: controller,
                          keyboardType: TextInputType.number,
                          placeholder: "请输入badge的数字",
                        ),
                      ),

                      const Padding(padding: EdgeInsets.only(top: 30)),
                      InkWell(
                        child: Container(
                          decoration: BoxDecoration(
                            boxShadow:  [
                              BoxShadow(
                                color: Colors.black.withOpacity(0.2),
                                offset: const Offset(0, 1),
                                blurRadius: 1.5,
                                spreadRadius: 2.5,
                              ),
                            ],
                            color: Colors.lightBlue,
                            borderRadius: BorderRadius.circular(8.0),
                          ),
                          alignment: Alignment.center,
                          height: 50,
                          width: 300,
                          child: const Text("点击设置角标",
                            style: TextStyle(
                              color: Colors.white,
                              fontWeight: FontWeight.bold,
                              fontSize: 18,
                            ),
                          ),
                        ),
                        onTap: () {
                          if (controller.text.isNotEmpty) {
                            FocusScope.of(context).requestFocus(FocusNode());
                            setBadge();
                          } else {
                            Fluttertoast.showToast(msg: "请先输入badge count");
                          }
                        },
                      ),

                      const Padding(padding: EdgeInsets.only(top: 30)),
                      InkWell(
                        child: Container(
                          decoration: BoxDecoration(
                            boxShadow:  [
                              BoxShadow(
                                color: Colors.black.withOpacity(0.2),
                                offset: const Offset(0, 1),
                                blurRadius: 1.5,
                                spreadRadius: 2.5,
                              ),
                            ],
                            color: Colors.lime,
                            borderRadius: BorderRadius.circular(8.0),
                          ),
                          alignment: Alignment.center,
                          height: 50,
                          width: 300,
                          child: const Text("点击移除角标",
                            style: TextStyle(
                              color: Colors.white,
                              fontWeight: FontWeight.bold,
                              fontSize: 18,
                            ),
                          ),
                        ),
                        onTap: () {
                          FocusScope.of(context).requestFocus(FocusNode());
                          removeBadge();
                        },
                      ),
                      const Padding(padding: EdgeInsets.only(top: 330)),
                    ],
                  ),
                ),
              ),
            ),
          ),
          onTap: () {
            FocusScope.of(context).requestFocus(FocusNode());
          },
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    WidgetsBinding.instance?.removeObserver(this);
  }
}

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

1 回复

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


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

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

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

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

iOS 配置

对于iOS,你需要确保在Info.plist中添加了Application supports iTunes file sharing的键值对,并且值设置为YES。这是因为badge_manager在iOS上依赖这个设置来管理角标。

Android 配置

对于Android,通常不需要特别的配置,但确保你的AndroidManifest.xml文件已经正确设置了应用的图标。

示例代码

下面是一个简单的Flutter应用示例,展示了如何使用badge_manager来设置和清除角标。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Badge Manager Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BadgeManagerExample(),
    );
  }
}

class BadgeManagerExample extends StatefulWidget {
  @override
  _BadgeManagerExampleState createState() => _BadgeManagerExampleState();
}

class _BadgeManagerExampleState extends State<BadgeManagerExample> {
  String _badgeStatus = 'No badge set';

  void _setBadge(int count) async {
    try {
      bool success = await BadgeManager.updateBadge(count);
      if (success) {
        setState(() {
          _badgeStatus = 'Badge set to $count';
        });
      } else {
        setState(() {
          _badgeStatus = 'Failed to set badge';
        });
      }
    } catch (e) {
      setState(() {
        _badgeStatus = 'Error: ${e.toString()}';
      });
    }
  }

  void _clearBadge() async {
    try {
      bool success = await BadgeManager.clearBadge();
      if (success) {
        setState(() {
          _badgeStatus = 'Badge cleared';
        });
      } else {
        setState(() {
          _badgeStatus = 'Failed to clear badge';
        });
      }
    } catch (e) {
      setState(() {
        _badgeStatus = 'Error: ${e.toString()}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Badge Manager Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _badgeStatus,
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _setBadge(5),
              child: Text('Set Badge to 5'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _clearBadge,
              child: Text('Clear Badge'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖安装:确保在pubspec.yaml中添加了badge_manager依赖。
  2. 导入包:在Dart文件中导入badge_manager包。
  3. 设置角标:使用BadgeManager.updateBadge(int count)方法来设置角标的值。
  4. 清除角标:使用BadgeManager.clearBadge()方法来清除角标。
  5. UI:简单的UI包含两个按钮,一个用于设置角标,另一个用于清除角标,以及显示当前角标状态的文本。

这个示例展示了基本的角标管理功能。根据你的需求,你可以进一步扩展这个示例,比如添加错误处理、用户权限请求等。

回到顶部