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
相关产品推荐
相关产品推荐

