Flutter Local Notification无法在设备屏幕显示问题求助
解决Flutter本地通知不显示的问题
针对你开发待办应用时遇到的flutter_local_notifications插件通知不显示问题,结合你的代码和配置,整理以下修复步骤:
1. 调整时区初始化顺序
你的main函数中先初始化通知、后初始化时区,会导致zonedSchedule无法正确识别时区,修改执行顺序:
void main(List<String> args) async { WidgetsFlutterBinding.ensureInitialized(); // 先初始化时区 tz.initializeTimeZones(); await LocalNotifications.init(); await Hive.initFlutter(); Hive.registerAdapter(TaskAdapter()); await Hive.openBox('myToDoBox'); UserOrient.configure( apiKey: 'b0841b71-e5b0-4b78-baa6-bd3b32815afb', languageCode: 'en', ); runApp( const ProviderScope( child: ToDoApp(), ), ); }
2. 避免固定通知ID导致覆盖
scheduleNotification方法中固定使用ID=0,每次创建任务都会覆盖之前的定时通知,改成动态生成唯一ID:
static Future<void> scheduleNotification( String title, String body, DateTime scheduledData) async { // 用时间戳生成唯一ID final int notificationId = DateTime.now().millisecondsSinceEpoch ~/ 1000; const NotificationDetails platformChannelSpecifics = NotificationDetails( android: AndroidNotificationDetails("channel_Id", "channel_Name", importance: Importance.high, priority: Priority.high), iOS: DarwinNotificationDetails(), ); await flutterLocalNotificationsPlugin.zonedSchedule(notificationId, title, body, tz.TZDateTime.from(scheduledData, tz.local), platformChannelSpecifics, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime); }
3. 显式创建Android通知渠道
Android 8.0及以上必须创建通知渠道才能显示通知,在LocalNotifications.init()中添加渠道创建逻辑:
static Future<void> init() async { const AndroidInitializationSettings androidInitializationSettings = AndroidInitializationSettings("@mipmap/ic_launcher"); // 配置iOS权限申请 const DarwinInitializationSettings iosInitalizationSettings = DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); const InitializationSettings initializationSettings = InitializationSettings( android: androidInitializationSettings, iOS: iosInitalizationSettings, ); await flutterLocalNotificationsPlugin.initialize( initializationSettings, onDidReceiveBackgroundNotificationResponse: onDidReceiveNotification, onDidReceiveNotificationResponse: onDidReceiveNotification, ); // 创建Android通知渠道 const AndroidNotificationChannel channel = AndroidNotificationChannel( "channel_Id", "channel_Name", description: "待办任务通知渠道", importance: Importance.high, ); await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel); await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.requestNotificationsPermission(); }
4. 补充iOS权限配置
在iOS的Info.plist中添加权限描述(Xcode中打开Info.plist添加):
<key>NSAlertUsageDescription</key> <string>需要通知权限来提醒您的待办任务</string> <key>NSBadgeUsageDescription</key> <string>需要徽章权限来显示待办任务数量</string> <key>NSSoundUsageDescription</key> <string>需要声音权限来提醒您的待办任务</string>
5. 添加错误捕获与日志
在scheduleNotification中添加异常捕获,方便排查问题:
static Future<void> scheduleNotification( String title, String body, DateTime scheduledData) async { try { final int notificationId = DateTime.now().millisecondsSinceEpoch ~/ 1000; const NotificationDetails platformChannelSpecifics = NotificationDetails( android: AndroidNotificationDetails("channel_Id", "channel_Name", importance: Importance.high, priority: Priority.high), iOS: DarwinNotificationDetails(), ); await flutterLocalNotificationsPlugin.zonedSchedule(notificationId, title, body, tz.TZDateTime.from(scheduledData, tz.local), platformChannelSpecifics, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime); print("定时通知已成功调度,ID: $notificationId"); } catch (e) { print("调度通知失败: $e"); } }
6. 验证通知触发时机
暂时注释掉Navigator.pop(context),测试通知是否能正常显示,排除页面跳转导致的触发中断问题。
内容的提问来源于stack exchange,提问作者Rufat Shikhiyev
相关产品推荐
相关产品推荐

