Flutter Cloud Messaging问题:推送通知在4次后停止显示
问题解答
一、通知发送4条后停止的问题
可能的原因及解决办法:
通知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', ), ), );FCM请求失败但未捕获错误
sendPushMessage的catch块直接return,没有打印错误信息,你无法得知请求是否成功。API key错误、Token过期、网络问题都可能导致推送失败。
解决办法:在catch里添加日志打印排查问题:catch (e) { print('推送失败:$e'); return; }初始化顺序存在竞态条件
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'); }检查模拟器通知设置
虽然新安装时正常,但多次推送后模拟器可能自动限制通知。去模拟器「设置-通知」里找到你的应用,确认通知权限和渠道重要性未被调低。
二、关于Token获取的问题
你的想法是对的——只要其他函数已经处理了Token的生成、刷新,并且及时同步到数据库,那你这里直接从数据库获取最新Token用于推送完全没问题。
但要注意两个关键点:
- 确保数据库里的Token是最新有效的:FCM Token会在应用重装、用户清除数据、系统更新等场景下刷新,如果其他函数没有监听Token刷新并更新数据库,你获取的Token可能已失效,导致推送失败。
- 确认
adsModel.token确实是从数据库读取的最新值,而非缓存的旧数据,否则推送也会失败。
内容的提问来源于stack exchange,提问作者Eben Oasis
相关产品推荐
相关产品推荐

