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

Flutter报错:'String'不是'List<dynamic>'子类型(Get+FCM场景)

类型不匹配错误:'String'不是'List'的子类型 排查与解决

报错原因

  1. FCM Data字段的类型限制:FCM的data payload仅支持字符串类型的键值对。发送时直接传入order.medicines(List类型),经jsonEncode后会被转为字符串形式的JSON数组,但接收时message.data['meds']获取到的是该字符串而非List,赋值给OrderModel.medicines(List类型)时触发类型不匹配。
  2. OrderModel.fromMap默认值错误:fromMap工厂方法中,medicines的默认值设为""(字符串),但该字段类型为List,当map['medicines']不存在时,直接导致类型不匹配。

解决方法

1. 发送端:将List转为JSON字符串传递

发送前把order.medicines序列化为JSON字符串,再传入data字段:

void sendOrder(OrderModel order) async {
    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>{
          'title': 'New Order',
          'body': order.name
        },
        'priority': 'high',
        'data': <String, dynamic>{
          'click_action': 'FLUTTER_NOTIFICATION_CLICK',
          'name': order.name,
          'phone': order.phone,
          // 将List转为JSON字符串
          'meds': jsonEncode(order.medicines),
          'token': order.orderToken
        },
        'to': '/topics/pharmacy'
      }),
    );
  }

2. 接收端:将字符串反序列化为List

接收时把message.data['meds']的字符串反序列化为List:

getMessage() {
    FirebaseMessaging.onMessage.listen((message) {
      Get.snackbar("New Order", message.data['name']);
      // 反序列化meds字符串为List
      List medsList = message.data['meds'] != null 
          ? jsonDecode(message.data['meds']) 
          : [];
      OrderModel order = OrderModel(
        name: message.data['name'] ?? '',
        phone: message.data['phone'] ?? '',
        medicines: medsList,
        orderToken: message.data['token'] ?? '',
      );
      usersOrders.add(order);
    });
    update();
  }

3. 修复OrderModel.fromMap的默认值错误

将medicines的默认值改为空List,确保类型匹配:

factory OrderModel.fromMap(Map<String, dynamic> map) {
    return OrderModel(
      name: map['name'] ?? "",
      phone: map['phone'] ?? "",
      // 将默认值从""改为[]
      medicines: map['medicines'] ?? [],
      orderToken: map['orderToken'] ?? "",
    );
  }

额外优化(可选)

为了类型安全,建议给medicines字段指定泛型(如List<MedicineModel>),同时在序列化/反序列化时处理对应模型的转换。

内容的提问来源于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.25 01:37:49