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

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']}',
          ),
        ),
      );
    }
  });
}

三、必做的基础检查

  1. 全局导航键配置:确保navKey是全局变量,并且在MaterialApp中设置了navigatorKey: navKey,否则无法触发页面跳转。
  2. Android通知渠道创建:在初始化时添加渠道创建代码,确保通知能正常显示和响应:
    await notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
    
  3. iOS权限配置:在Info.plist中添加后台推送权限:
    <key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>
    
  4. payload传递:本地通知的scheduleNotification方法中,要传递有区分度的payload,方便点击时判断跳转目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:34:58