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
相关产品推荐
相关产品推荐

