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

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结构:

  1. 用await等待getToken()执行完成,拿到真实的token字符串
  2. 将获取到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:01:12