Flutter中应用终止状态下点击本地通知的处理方案
解决Flutter应用终止状态下通知点击无响应的问题
你当前的问题核心是没正确处理本地通知和Firebase推送通知在应用终止状态下的唤起逻辑,以下是针对性的修复方案:
一、本地通知(scheduleNotification创建的通知)的终止状态处理
你调用了getNotificationAppLaunchDetails()但没有处理返回结果,这个方法才是获取应用是否被本地通知唤起的关键。修改initNotifications()中的相关代码:
// 初始化本地通知设置 var initializationSettingsAndroid = const AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = const DarwinInitializationSettings(); var initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS); // 获取本地通知启动详情并处理 final notificationAppLaunchDetails = await notificationsPlugin.getNotificationAppLaunchDetails(); if (notificationAppLaunchDetails?.didNotificationLaunchApp ?? false) { final response = notificationAppLaunchDetails!.notificationResponse; // 根据payload判断跳转页面,比如你设置的'my_payload'或者自定义内容 if (response.payload == 'my_payload') { navKey.currentState?.push( MaterialPageRoute(builder: (context) => const CheckPage()), ); } // 可以添加更多payload对应的跳转逻辑 } // 再初始化通知插件 await notificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: onDidReceiveNotificationResponse, onDidReceiveBackgroundNotificationResponse: onDidReceiveNotificationResponse);
二、Firebase推送通知的终止状态处理
你用了getInitialMessage()但存在两个问题:固定延迟不可靠、判断逻辑可以优化。用WidgetsBinding.instance.addPostFrameCallback替代固定延迟,确保导航键初始化完成后再跳转:
FirebaseMessaging messaging = FirebaseMessaging.instance; RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { // 等待UI框架初始化完成后再跳转,替代固定延迟 WidgetsBinding.instance.addPostFrameCallback((_) { if (initialMessage.data['invoice_id'] != null) { navKey.currentState?.push( MaterialPageRoute( builder: (context) => WareHouseSalesDetails( id: int.parse(initialMessage.data['id']), invoiceId: '${initialMessage.data['invoice_id']}', ), ), ); } else if (initialMessage.data['moving_id'] != null) { navKey.currentState?.push( MaterialPageRoute( builder: (context) => MovingDetailsPage( id: int.parse(initialMessage.data['id']), movingId: '${initialMessage.data['moving_id']}', ), ), ); } }); }
三、必做的基础检查
- 全局导航键配置:确保
navKey是全局变量,并且在MaterialApp中设置了navigatorKey: navKey,否则无法触发页面跳转。 - Android通知渠道创建:在初始化时添加渠道创建代码,确保通知能正常显示和响应:
await notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel); - iOS权限配置:在
Info.plist中添加后台推送权限:<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array> - payload传递:本地通知的
scheduleNotification方法中,要传递有区分度的payload,方便点击时判断跳转目标。
内容的提问来源于stack exchange,提问作者st4tic
相关产品推荐
相关产品推荐

