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

Flutter Cloud Messaging问题:推送通知在4次后停止显示

问题解答

一、通知发送4条后停止的问题

可能的原因及解决办法:

  1. 通知ID重复导致被覆盖
    你在listenFCM里调用flutterLocalNotificationsPlugin.show时,用notification.hashCode作为通知ID。如果多条通知的标题、内容完全一致,它们的hashCode会相同,Android系统会直接替换旧通知,而非新增一条,这会让你误以为通知停止推送。
    解决办法:改用唯一ID,比如时间戳或递增计数器:

    flutterLocalNotificationsPlugin.show(
      DateTime.now().millisecondsSinceEpoch, // 生成唯一ID
      notification.title,
      notification.body,
      NotificationDetails(
        android: AndroidNotificationDetails(
          channel.id,
          channel.name,
          icon: 'launch_background',
        ),
      ),
    );
    
  2. FCM请求失败但未捕获错误
    sendPushMessage的catch块直接return,没有打印错误信息,你无法得知请求是否成功。API key错误、Token过期、网络问题都可能导致推送失败。
    解决办法:在catch里添加日志打印排查问题:

    catch (e) {
      print('推送失败:$e');
      return;
    }
    
  3. 初始化顺序存在竞态条件
    initState里同时调用多个异步方法,listenFCM可能在loadFCM初始化flutterLocalNotificationsPlugin之前执行,导致后续通知无法正常显示。
    解决办法:把初始化逻辑改成异步顺序执行:

    @override
    void initState() {
      super.initState();
      _initFCM();
    }
    
    Future<void> _initFCM() async {
      await requestPermission();
      await loadFCM();
      listenFCM();
      await getToken();
      FirebaseMessaging.instance.subscribeToTopic('RIDE_REQUESTS');
    }
    
  4. 检查模拟器通知设置
    虽然新安装时正常,但多次推送后模拟器可能自动限制通知。去模拟器「设置-通知」里找到你的应用,确认通知权限和渠道重要性未被调低。

二、关于Token获取的问题

你的想法是对的——只要其他函数已经处理了Token的生成、刷新,并且及时同步到数据库,那你这里直接从数据库获取最新Token用于推送完全没问题。

但要注意两个关键点:

  • 确保数据库里的Token是最新有效的:FCM Token会在应用重装、用户清除数据、系统更新等场景下刷新,如果其他函数没有监听Token刷新并更新数据库,你获取的Token可能已失效,导致推送失败。
  • 确认adsModel.token确实是从数据库读取的最新值,而非缓存的旧数据,否则推送也会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:38:16