Flutter本地通知flutter_local_notifications插件使用

5,733 阅读3分钟

插件地址:pub.flutter-io.cn/packages/fl…

本机开发环境:flutter 2.10.0 sdk时无法下载最新 ^9.6.0版本的插件,这里更新到了3.0

不更新3.0的话么,可以尝试使用9.1.6版本,我在尝试时发现一些错误,missing plugin error..索性直接更新到了flutter sdk3.0.0版本

Flutter 3.0.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision fb57da5f94 (3 weeks ago) • 2022-05-19 15:50:29 -0700
Engine • revision caaafc5604
Tools • Dart 2.17.1 • DevTools 2.12.2

使用:引入插件flutter_local_notifications: ^9.6.0

dependencies:
  flutter_local_notifications: ^9.6.0

在dart中引用

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

代码封装:notificationUtils

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

///@author zhc 2022/6/8 10:59 上午
///通知管理工具

class Notification {
  final FlutterLocalNotificationsPlugin np = FlutterLocalNotificationsPlugin();

  /// main 初始化
  init() async {
    var android = const AndroidInitializationSettings("@mipmap/ic_launcher");
    var ios = const IOSInitializationSettings();

    await np.initialize(InitializationSettings(android: android, iOS: ios),
        onSelectNotification: selectNotification);
  }

  //点击通知回调事件
  void selectNotification(String? payload) async {
    if (payload != null) {
      debugPrint('notification payload: $payload');
      
      // todo 这里根据自己的业务处理
      
      
    }
  }

  /// params为点击通知时,可以拿到的参数,title和body仅仅是展示作用
  /// Map params = {};
  /// params['type'] = "100";
  /// params['id'] = "10086";
  /// params['content'] = "content";
  /// notification.send("title", "content",params: json.encode(params));
  ///
  /// notificationId指定时,不在根据时间生成
  void send(String title, String body, {int? notificationId, String? params}) {
    // 构建描述
    var androidDetails = const AndroidNotificationDetails(
        //区分不同渠道的标识
      'channelId', 
      
      //channelName渠道描述不要随意填写,会显示在手机设置,本app 、通知列表中,
      //规范写法根据业务:比如: 重要通知,一般通知、或者,交易通知、消息通知、等
      'channelName',
      
      //通知的级别
      importance: Importance.max,
      priority: Priority.high,
      
      //可以单独设置每次发送通知的图标
      // icon: ''

      //显示进度条 3个参数必须同时设置
      // progress: 19,
      // maxProgress: 100,
      // showProgress: true
    );
    //ios配置选项相对较少
    var iosDetails = const IOSNotificationDetails();
    var details = NotificationDetails(android: androidDetails, iOS: iosDetails);

    // 显示通知, 第一个参数是id,id如果一致则会覆盖之前的通知
    // String? payload, 点击时可以拿到的参数
    np.show(notificationId ?? DateTime.now().millisecondsSinceEpoch >> 10,
        title, body, details,
        payload: params);
  }

  ///清除所有通知
  void cleanNotification() {
    np.cancelAll();
  }

  ///清除指定id的通知
  /// `tag`参数指定Android标签。 如果提供,
  /// 那么同时匹配 id 和 tag 的通知将会
  /// 被取消。 `tag` 对其他平台没有影响。
  void cancelNotification(int id, {String? tag}) {
    np.cancel(id, tag: tag);
  }
}

var notification = Notification();

具体使用方式:

1、在main函数中初始化插件;

void main() async{
  //初始化本地通知
  WidgetsFlutterBinding.ensureInitialized();
  await notification.init();
  runApp(const MyApp());
}

2、发送一个本地通知:

commonButton(context, "发送本地通知", onPressed: () async {
  
  //send 之前先判断权限
  // 某些权限不会显示要求用户允许或拒绝请求的权限的对话框。
  // 这是因为正在检索应用程序的操作系统设置以获得相应的权限。
  // 设置的状态将决定权限是granted还是denied。
  // 以下权限将不显示对话框:
  // 通知
  // 蓝牙
  if (await Permission.notification.request().isGranted) {
    debugPrint("isGranted true");
    //点击发送通知
    Map params = {};
    params['type'] = 200;
    params['id'] = "10086";
    params['content'] = "content";
    notification.send("title", "content", params: json.encode(params));
  }else{
    debugPrint("isGranted false");
    //打开应用设置
    final flag = await NftDialogUtils.showCommonTipsDialog(context, "请打开设置,勾选通知权限");
    if(flag != null && flag){
      openAppSettings();
    }
    
  }
  
            })

3、其他api 可以在工具中进行拓展,根据业务需要,不在说明

效果截图:

image.png

点击通知输出:

image.png

打包时注意事项:GSON混淆配置

参考文章:

pub.flutter-io.cn/packages/fl…

blog.csdn.net/qq_41806966…