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

使用flutter_local_notifications无报错但通知不弹出如何解决

Flutter Local Notifications 无报错、无通知弹出问题修复

核心原因:现有代码缺失插件初始化、平台权限申请两个必要前置流程,插件未完成注册、无系统通知权限时,调用show()方法不会抛出异常,也不会弹出通知。


修复步骤

    1. 补全插件初始化逻辑
      必须在应用启动阶段(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());
}
    1. 补全Android平台权限处理
      Android 13(API 33)及以上版本需要申请运行时通知权限,否则系统默认拦截所有通知,且无错误回调:
// 调用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即可。

    1. 补全iOS平台配置
      打开ios/Runner/Info.plist,在根<dict>节点下添加后台通知权限配置:
<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:18:33