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

Flutter中JSON映射实体类遇类型不匹配错误,求categories映射方案

解决Flutter中JSON转对象时的类型不匹配错误

你碰到的这个错误根源很明确:从map['categories']取出的每个元素是_InternalLinkedHashMap<dynamic, dynamic>类型,而你的Category.fromMap方法要求传入的是Map<String, dynamic>,两者没法直接隐式转换。下面是具体的修复方案:

1. 修正Entry类中categories的转换逻辑

在Entry.fromMap方法里,处理categories列表时,需要显式把每个动态类型的Map转换成Map<String, dynamic>。修改后的代码如下:

categories = (map['categories'] as List)
    .map((data) => Category.fromMap(data as Map<String, dynamic>))
    .toList();

这里先把map['categories']强制转为List,再对每个元素data显式转成Map<String, dynamic>后传入Category.fromMap,就能解决类型不匹配的问题。

2. 修复Category类中penalty字段的错误逻辑

另外注意到你给penalty赋值的逻辑完全搞反了:penalty = !map.containsKey('penalty');会导致有penalty字段的Category反而penalty为false,没有该字段的反而为true。正确的处理应该是:如果map里包含penalty字段就取它的值,否则默认设为false:

penalty = map.containsKey('penalty') ? map['penalty'] : false;

完整修复后的代码

Entry类

class Entry {
  String name;
  int minPlayers;
  int maxPlayers;
  bool enabled;
  bool selected = false;
  DocumentReference reference;
  List<Category> categories;

  Entry.fromMap(Map<String, dynamic> map, {this.reference}) {
    name = map['name'];
    enabled = map['enabled'];
    minPlayers = map['minPlayers'];
    maxPlayers = map['maxPlayers'];
    // 修复categories的类型转换逻辑
    categories = (map['categories'] as List)
        .map((data) => Category.fromMap(data as Map<String, dynamic>))
        .toList();
  }
}

Category类

class Category {
  String name;
  int order;
  int multiplier;
  bool penalty;

  Category.fromMap(Map<String, dynamic> map, {DocumentReference reference}) {
    name = map['name'];
    order = map['order'];
    // 处理multiplier字段可能缺失的情况(比如你的Category 2没有该字段)
    multiplier = map['multiplier'] ?? 0;
    // 修复penalty的赋值逻辑
    penalty = map.containsKey('penalty') ? map['penalty'] : false;
  }

  Category.fromSnapshot(DocumentSnapshot snapshot)
      : this.fromMap(snapshot.data, reference: snapshot.reference);
}

额外提醒:你的JSON里Category 2没有multiplier字段,所以在Category.fromMap里给multiplier赋值时加上空值判断(用??设置默认值),能避免潜在的空指针错误。

内容的提问来源于stack exchange,提问作者CovertDad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:12