从Firebase读取JSON时UserModel类型转换错误求助
问题分析
错误type '_Map<String, dynamic>' is not a subtype of type 'List' in type cast出现在UserModel.fromSnapshot里的(snapshot['ins'] as List)这行,核心原因有两种可能:
- Firebase用户文档的
ins字段实际是Map类型,但代码里强行把它当成List转换; - 或者
ins是List,但你用InsModel.fromSnapshot(e)解析元素时出错——fromSnapshot是为独立的DocumentSnapshot设计的,而List里的元素其实是文档内嵌套的Map<String, dynamic>,并非独立的Firebase文档快照。
从代码结构判断,第二种情况的概率更高:你误将文档内的嵌套Map数组当成了独立文档快照列表处理。
解决方案
步骤1:给InsModel添加解析Map的工厂方法
新增fromJson方法专门处理嵌套的Map数据,同时可以保留原有的fromSnapshot方法兼容独立文档场景:
class InsModel extends InsEntity { const InsModel({super.category, super.type, super.owned}); // 新增:解析嵌套Map的工厂方法 factory InsModel.fromJson(Map<String, dynamic> json) { return InsModel( category: json['category'], type: json['type'], owned: json['owned']); } // 保留解析独立文档快照的方法(可选) factory InsModel.fromSnapshot(DocumentSnapshot snap) { var snapshot = snap.data() as Map<String, dynamic>; return InsModel.fromJson(snapshot); } Map<String, dynamic> toJson() => {'category': category, 'type': type, 'owned': owned}; }
步骤2:修改UserModel中解析ins的逻辑
把原来的InsModel.fromSnapshot(e)替换为InsModel.fromJson(e),同时增加类型判断避免强制转换崩溃:
class UserModel extends UserEntity { const UserModel({super.name, super.uid, super.ins}); factory UserModel.fromSnapshot(DocumentSnapshot snap) { var snapshot = snap.data() as Map<String, dynamic>; // 先判断ins是否为List,避免类型转换错误 final insList = snapshot['ins'] as List?; return UserModel( uid: snapshot['uid'], name: snapshot['name'], ins: insList?.map((e) => InsModel.fromJson(e as Map<String, dynamic>)).toList(), ); } Map<String, dynamic> toJson() => { 'uid': uid, 'name': name, 'ins': ins?.map((e) => (e as InsModel).toJson()).toList(), }; }
额外注意事项
- 如果Firebase中
ins字段确实是Map而非List,你需要要么调整数据结构改为List,要么修改UserEntity里的ins类型为Map<String, InsEntity>?,并对应修改解析逻辑; - 建议在强制转换前增加类型检查(比如
snapshot['ins'] is List),避免程序崩溃。
内容的提问来源于stack exchange,提问作者Mus
相关产品推荐
相关产品推荐

