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
相关产品推荐
相关产品推荐

