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

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
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:06:41