Flutter Local Notification无响应求助(附报错栈与代码)
Flutter Local Notifications 点击按钮无通知弹出问题
问题描述
已将flutter local notifications包添加至项目,严格遵循视频教程步骤操作,但点击按钮后无通知弹出,以下是相关报错信息及代码:
报错栈信息
E/flutter (13614): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7) E/flutter (13614): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:177:18) E/flutter (13614): <asynchronous suspension> E/flutter (13614): #2 FlutterLocalNotificationsPlugin.show (package:flutter_local_notifications/src/flutter_local_notifications_plugin.dart:215:7) E/flutter (13614): <asynchronous suspension> E/flutter (13614): #3 LocalNotificationService.showNotification (package:electromobility_flutter_application/services/local_notification_service.dart:56:5) E/flutter (13614): <asynchronous suspension> E/flutter (13614): #4 _WalletState.build.<anonymous closure> (package:electromobility_flutter_application/Account/Wallet/WalletPage.dart:309:31) E/flutter (13614): <asynchronous suspension> E/flutter (13614):
LocalNotificationService 完整代码
class LocalNotificationService { LocalNotificationService(); final _localNotificationService = FlutterLocalNotificationsPlugin(); Future<void> initialize() async{ const AndroidInitializationSettings androidInitializationSettings= AndroidInitializationSettings('@drawable/ic_stat_android'); IOSInitializationSettings iosInitializationSettings = IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, onDidReceiveLocalNotification: _onDidReceiveLocalNotification ); final InitializationSettings settings = InitializationSettings( android: androidInitializationSettings, iOS: iosInitializationSettings, ); await _localNotificationService.initialize( settings, onSelectNotification: onSelectNotification, ); } Future<NotificationDetails> _notificationsDetails() async { const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel_id', 'channel_name', channelDescription: 'description', importance: Importance.max, priority: Priority.max, playSound: true); const IOSNotificationDetails iosNotificationDetails = IOSNotificationDetails(); return const NotificationDetails( android: androidNotificationDetails, iOS: iosNotificationDetails, ); } Future<void> showNotification({ required int id, required String title, required String body, }) async { final details = await _notificationsDetails(); await _localNotificationService.show(id, title, body, details); } void _onDidReceiveLocalNotification( int id,String? title,String? body,String? payload) { print('id $id'); } void onSelectNotification( String? payload) { print('payload $payload'); } }
页面触发代码
onPressed: () async {await service.showNotification(id: 0, title: 'title', body: 'body');}
排查及解决建议
- 确认初始化时机:必须在调用
showNotification前完成LocalNotificationService.initialize()的调用,建议在main函数或首页的initState中执行初始化操作,未初始化直接调用通知方法会触发底层通道错误。 - 检查Android图标有效性:确保
@drawable/ic_stat_android图标存在于Android项目的res/drawable目录下,且图标尺寸符合Android通知图标规范(建议用透明背景的单色图标,尺寸为24x24dp),图标缺失或格式错误会导致通知无法弹出。 - 补全Android渠道创建逻辑:Android 8.0及以上版本要求必须创建通知渠道,可在初始化方法中添加渠道创建代码:
// 在initialize方法中,初始化完成后添加 await _localNotificationService.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(const AndroidNotificationDetails('channel_id', 'channel_name', channelDescription: 'description')); - 处理权限问题:
- iOS端:确认用户已授予通知权限,可在初始化后检查权限状态,若未授权则引导用户前往设置开启。
- Android 13+:需主动申请
POST_NOTIFICATIONS权限,可添加权限申请逻辑:if (Platform.isAndroid) { final androidImpl = _localNotificationService.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>(); final granted = await androidImpl?.requestPermission(); if (granted != true) { // 处理权限被拒绝的场景 } }
- 添加异常捕获:在
showNotification方法中包裹try-catch,打印具体错误信息,便于精准定位问题:Future<void> showNotification({ required int id, required String title, required String body,
}) async {
try {
final details = await _notificationsDetails();
await _localNotificationService.show(id, title, body, details);
} catch (e) {
print('通知弹出失败:$e');
}
}
内容的提问来源于stack exchange,提问作者Bill Tertis
相关产品推荐
相关产品推荐

