Firebase Messaging升级后发送通知报错:无法编码Future<String?>实例
解决firebase_messaging 14.0.2版本发送FCM通知时的序列化错误
错误原因
你碰到的Converting object to an encodable object failed: Instance of 'Future<String?>'错误,是因为FirebaseMessaging.instance.getToken()在新版本里返回的是异步Future对象,你直接把这个未完成的Future塞进jsonEncode参数里,JSON序列化器没法处理这种类型,所以报错。旧版本7.0.1中这个方法是同步返回token的,之前能正常运行,升级后API行为变了才出问题。
修复方法
先异步拿到token的实际值,再传入JSON结构:
- 用
await等待getToken()执行完成,拿到真实的token字符串 - 将获取到的token赋值给
to字段
修改后的完整代码
sendNotif(String? title, String? body, String? id) async { try { // 先异步获取设备FCM token String? deviceToken = await FirebaseMessaging.instance.getToken(); // 可选:处理token为空的情况,避免无效请求 if (deviceToken == null) { print("无法获取设备FCM token"); return; } await http.post( Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: <String, String>{ 'Content-Type': 'application/json', 'Authorization': 'key=$serverToken', }, body: jsonEncode( <String, dynamic>{ 'notification': <String, dynamic>{ 'body': body.toString(), 'title': title.toString() }, 'priority': 'high', 'data': <String, dynamic>{ 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'id': id.toString(), }, 'to': deviceToken, // 使用已获取到的真实token }, ), ).then((value) { print("通知发送成功"); }); } catch (e) { print("发送通知出错:$e"); } }
额外注意事项
- 确保
serverToken是你在Firebase控制台获取的服务器密钥,配置错误会导致请求被拒绝 - 建议保留token为空的判断逻辑,避免因token获取失败发起无效的FCM请求
内容的提问来源于stack exchange,提问作者Abderrazzakk Belghite
相关产品推荐
相关产品推荐

