Flutter报错:'String'不是'List<dynamic>'子类型(Get+FCM场景)
类型不匹配错误:'String'不是'List'的子类型 排查与解决
报错原因
- FCM Data字段的类型限制:FCM的
datapayload仅支持字符串类型的键值对。发送时直接传入order.medicines(List类型),经jsonEncode后会被转为字符串形式的JSON数组,但接收时message.data['meds']获取到的是该字符串而非List,赋值给OrderModel.medicines(List类型)时触发类型不匹配。 - 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
相关产品推荐
相关产品推荐

