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

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()方法,专门用于获取应用终止状态下点击通知启动的消息,可靠性更高,步骤如下:

  1. 全局NavigatorKey配置:确保启动时能获取到可用的Context
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
  1. 启动时检查初始消息:在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));
}
  1. 平台配置补充
    • 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>
      

方法2:修复flutter_local_notifications的didNotificationLaunchApp逻辑

若要继续使用插件的方法,需确保以下两点:

  1. 正确的初始化顺序:必须在插件初始化完成后再调用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(...),
    );
  }
}
  1. 发送FCM数据消息:需发送包含data字段的消息,而非纯notification消息,示例payload:
{
  "to": "DEVICE_TOKEN",
  "data": {
    "id": "1",
    "title": "测试通知",
    "body": "点击查看详情",
    "click_action": "FLUTTER_NOTIFICATION_CLICK"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:15:44