使用flutter_local_notifications无报错但通知不弹出如何解决
Flutter Local Notifications 无报错、无通知弹出问题修复
核心原因:现有代码缺失插件初始化、平台权限申请两个必要前置流程,插件未完成注册、无系统通知权限时,调用show()方法不会抛出异常,也不会弹出通知。
修复步骤
- 补全插件初始化逻辑
必须在应用启动阶段(main()函数runApp()前)执行插件初始化,否则插件无法响应调用:
- 补全插件初始化逻辑
void main() async { // 必须先绑定Flutter引擎 WidgetsFlutterBinding.ensureInitialized(); // 初始化本地通知插件 const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); const IOSInitializationSettings iosInit = IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); await FlutterLocalNotificationsPlugin().initialize( const InitializationSettings(android: androidInit, iOS: iosInit) ); runApp(const MyApp()); }
- 补全Android平台权限处理
Android 13(API 33)及以上版本需要申请运行时通知权限,否则系统默认拦截所有通知,且无错误回调:
- 补全Android平台权限处理
// 调用show方法前先校验、申请权限 if (Platform.isAndroid) { final androidImpl = FlutterLocalNotificationsPlugin() .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>(); final permissionGranted = await androidImpl?.requestNotificationsPermission(); if (permissionGranted != true) return; }
额外注意:原代码中Android渠道ID为Channel id包含空格,部分国产ROM会拦截格式不规范的渠道通知,修改为无空格字符串如default_channel即可。
- 补全iOS平台配置
打开ios/Runner/Info.plist,在根<dict>节点下添加后台通知权限配置:
- 补全iOS平台配置
<key>UIBackgroundModes</key> <array> <string>fetch</string> <string>remote-notification</string> </array>
修正后完整工具类代码
import 'dart:io'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class LocalNotificationUtil { static final FlutterLocalNotificationsPlugin _notification = FlutterLocalNotificationsPlugin(); static Future<NotificationDetails> _buildNotificationDetails() async { return const NotificationDetails( android: AndroidNotificationDetails( 'default_channel', '通用通知渠道', channelDescription: '应用默认通知展示渠道', importance: Importance.max, priority: Priority.high, ), iOS: IOSNotificationDetails( presentAlert: true, presentBadge: true, presentSound: true, ), ); } static Future<void> showNotification({ int id = 0, String? title, String? body, String? payload, }) async { // Android权限校验 if (Platform.isAndroid) { final androidImpl = _notification.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>(); final granted = await androidImpl?.requestNotificationsPermission(); if (granted != true) return; } await _notification.show( id, title, body, await _buildNotificationDetails(), payload: payload, ); } }
额外排查点
- 禁止在后台Isolate中直接调用通知方法,插件仅支持主Isolate调用
- 测试前手动确认系统设置中当前应用的通知开关为开启状态,部分国产ROM默认关闭新安装应用的通知权限
- 避免重复使用相同通知ID,部分系统会合并同ID通知,导致视觉上无新通知弹出
内容的提问来源于stack exchange,提问作者Mohamed Hussien
相关产品推荐
相关产品推荐

