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

Flutter本地通知调度问题:Android 7崩溃,Android 8+正常

Android 7设备调度Flutter本地通知崩溃的解决方案

核心原因

Android 8(API 26)引入了通知渠道机制,而Android 7及以下系统不支持该特性。flutter_local_notifications: ^12.0.4若未针对低版本做兼容处理(比如在Android 7设备上调用仅API 26+支持的创建渠道方法),会直接引发崩溃。

具体修复步骤

1. 初始化时区分版本创建通知渠道

仅在Android 8及以上设备中创建通知渠道,避免低版本触发不兼容API:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:platform/platform.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  // Android初始化配置
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');

  final InitializationSettings initializationSettings =
      InitializationSettings(android: initializationSettingsAndroid);
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  // 仅API 26+创建通知渠道
  if (Platform.isAndroid) {
    final androidPlugin = flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()!;
    final sdkVersion = await androidPlugin.getAndroidSdkVersion();
    if (sdkVersion >= 26) {
      const channel = AndroidNotificationChannel(
        'default_channel',
        '默认通知渠道',
        '用于展示常规本地通知',
        importance: Importance.max,
      );
      await androidPlugin.createNotificationChannel(channel);
    }
  }
}

2. 调度通知时兼容低版本参数

调度通知时,无需给Android 7设备单独处理channelId(插件会自动忽略低版本不支持的参数),但确保不要传递仅高版本支持的配置:

Future<void> scheduleNotification() async {
  AndroidNotificationDetails androidDetails;
  final androidPlugin = flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()!;
  final sdkVersion = await androidPlugin.getAndroidSdkVersion();

  if (sdkVersion >= 26) {
    androidDetails = const AndroidNotificationDetails(
      'default_channel',
      '默认通知渠道',
      channelDescription: '用于展示常规本地通知',
      importance: Importance.max,
      priority: Priority.high,
    );
  } else {
    androidDetails = const AndroidNotificationDetails(
      'default_channel',
      '默认通知渠道',
      importance: Importance.max,
      priority: Priority.high,
    );
  }

  final notificationDetails = NotificationDetails(android: androidDetails);
  await flutterLocalNotificationsPlugin.schedule(
    0,
    '测试通知',
    '这是一条本地测试通知',
    DateTime.now().add(const Duration(seconds: 5)),
    notificationDetails,
  );
}

3. 检查AndroidManifest权限配置

确保AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

POST_NOTIFICATIONS为API 33+所需权限,低版本系统会自动忽略,无需额外判断。

关键注意事项

  • 禁止在Android 7及以下设备调用createNotificationChannel方法,该方法仅API 26+支持,低版本调用会抛出NoSuchMethodException。
  • 确认minSdkVersion已设置为21(与你的配置一致),flutter_local_notifications: ^12.0.4原生支持该最低版本。

内容的提问来源于stack exchange,提问作者Jay Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:10:15