You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何正确集成notification_permissions包实现通知权限检测?

集成notification_permissions实现通知权限检测

1. 更新依赖

在pubspec.yaml的依赖列表中添加notification_permissions包:

dependencies:
  firebase_core: ^1.22.0
  firebase_messaging: ^13.0.1
  flutter_local_notifications: ^9.9.1
  notification_permissions: ^0.6.1 # 新增权限检测包

执行flutter pub get完成依赖安装。

2. 原生平台配置

  • Android:无需额外配置,包会自动处理权限请求逻辑。
  • iOS:在项目的Info.plist中添加权限描述:
<key>NSNotificationSettingsUsageDescription</key>
<string>需要通知权限接收推送消息</string>
<key>NSAlertUsageDescription</key>
<string>需要弹窗权限展示通知内容</string>

3. 改造notification.dart,添加权限检测逻辑

导入权限包并新增权限检查/请求方法,同时修复原代码中重复初始化通知插件的问题:

import 'dart:convert';

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:notification_permissions/notification_permissions.dart'; // 新增导入

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

Future<void> initFcm() async {
  await Firebase.initializeApp();

  var initializationSettingsAndroid = const AndroidInitializationSettings('@mipmap/ic_launcher');
  var initializationSettingsIOS = const IOSInitializationSettings();
  var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
  
  // 移除重复的initialize调用
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  FirebaseMessaging.onMessage.listen((RemoteMessage? message) async {
    RemoteNotification? notification = message?.notification;
    AndroidNotification? android = message?.notification?.android;
    if (notification != null && android != null) {
      flutterLocalNotificationsPlugin.show(
        notification.hashCode,
        notification.title,
        notification.body,
        const NotificationDetails(android: AndroidNotificationDetails('channel.id', 'channel.name')),
        payload: json.encode(message?.data),
      );
    }
  });
}

// 新增:检查并请求通知权限的方法
Future<PermissionStatus> checkAndRequestNotificationPermission() async {
  // 获取当前权限状态
  PermissionStatus status = await NotificationPermissions.getNotificationPermissionStatus();
  
  // 未授权则发起请求
  if (status != PermissionStatus.granted) {
    status = await NotificationPermissions.requestNotificationPermissions();
  }
  
  return status;
}

4. 改造HomePage,添加交互触发权限检查

将原无状态组件改为有状态,给按钮添加点击事件触发权限检查:

import 'package:flutter/material.dart';
import 'package:untitled/notification.dart';

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home page'), centerTitle: true),
      body: Center(
        child: ElevatedButton(
          onPressed: _checkNotificationPermission,
          child: const Text('检查通知权限'),
        ),
      ),
    );
  }

  // 权限检查逻辑
  void _checkNotificationPermission() async {
    PermissionStatus status = await checkAndRequestNotificationPermission();
    
    // 根据权限状态提示用户
    String message;
    switch(status) {
      case PermissionStatus.granted:
        message = '通知权限已授权';
        break;
      case PermissionStatus.denied:
        message = '通知权限已拒绝,请前往设置开启';
        break;
      case PermissionStatus.provisional:
        message = '通知权限临时授权';
        break;
      default:
        message = '权限状态未知';
    }
    
    if(mounted) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message)));
    }
  }
}

5. 可选:APP启动时自动检查权限

如果需要在APP启动时自动检测权限,修改main.dart:

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  await initFcm();
  // 启动时自动检查权限
  await checkAndRequestNotificationPermission();
  runApp(const App());
}

内容的提问来源于stack exchange,提问作者Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:05:31