Flutter应用终止时点击通知如何弹出对话框?
解决方案:应用终止时点击FCM通知弹出对话框
一、didNotificationLaunchApp始终返回false的常见原因
- 插件初始化顺序错误:如果在
flutterLocalNotificationsPlugin.initialize()完成前就调用getNotificationAppLaunchDetails(),会导致didNotificationLaunchApp返回false。 - FCM消息类型问题:若通过FCM控制台发送的是纯
notification类型消息(而非data消息),flutter_local_notifications无法将其识别为自身触发的启动事件。 - 平台配置缺失:Android未配置
FLUTTER_NOTIFICATION_CLICK的intent filter,iOS未开启远程通知后台模式,导致插件无法捕获启动来源。
二、可行的解决方法
方法1:结合FCM原生API处理应用终止启动场景
FCM提供的getInitialMessage()方法,专门用于获取应用终止状态下点击通知启动的消息,可靠性更高,步骤如下:
- 全局NavigatorKey配置:确保启动时能获取到可用的Context
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
- 启动时检查初始消息:在
main()中初始化Firebase后立即执行检查
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 检查是否由FCM通知启动应用 RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { // 延迟执行弹窗,确保Context已就绪 WidgetsBinding.instance.addPostFrameCallback((_) { showDialog( context: navigatorKey.currentContext!, builder: (_) => AlertDialog( title: Text(initialMessage.notification?.title ?? "通知"), content: Text(initialMessage.notification?.body ?? ""), actions: [ TextButton( onPressed: () => Navigator.pop(_), child: const Text("确定"), ) ], ), ); }); } // 初始化flutter_local_notifications(保持原有逻辑) await initLocalNotifications(); runApp(MyApp(navigatorKey: navigatorKey)); }
- 平台配置补充
- Android:在
AndroidManifest.xml的MainActivity标签内添加intent filter:<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> - iOS:在
Info.plist中开启远程通知后台模式:<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>
- Android:在
方法2:修复flutter_local_notifications的didNotificationLaunchApp逻辑
若要继续使用插件的方法,需确保以下两点:
- 正确的初始化顺序:必须在插件初始化完成后再调用
getNotificationAppLaunchDetails()
Future<void> initLocalNotifications() async { const AndroidInitializationSettings androidSettings = AndroidInitializationSettings('@mipmap/ic_launcher'); const DarwinInitializationSettings iosSettings = DarwinInitializationSettings(); const InitializationSettings settings = InitializationSettings( android: androidSettings, iOS: iosSettings, ); // 先完成初始化 await flutterLocalNotificationsPlugin.initialize(settings, onDidReceiveNotificationResponse: (response) { // 前台/后台点击通知的处理逻辑 showDialog(...); }); // 再检查启动来源 final NotificationAppLaunchDetails? launchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); if (launchDetails?.didNotificationLaunchApp ?? false) { // 处理启动时的通知点击 showDialog( context: navigatorKey.currentContext!, builder: (_) => AlertDialog(...), ); } }
- 发送FCM数据消息:需发送包含
data字段的消息,而非纯notification消息,示例payload:
{ "to": "DEVICE_TOKEN", "data": { "id": "1", "title": "测试通知", "body": "点击查看详情", "click_action": "FLUTTER_NOTIFICATION_CLICK" } }
内容的提问来源于stack exchange,提问作者yazicifatihcan
相关产品推荐
相关产品推荐

