Flutter嵌套自定义对象存入Firestore报错:Invalid argument: Instance of 'UserContact'
错误原因与解决方案
错误原因
Firebase Firestore仅支持存储原生数据类型(字符串、数字、布尔值等)或可序列化为原生类型的Map/List。你的AnswerModel.toMap()方法中,直接将List<UserContact>类型的userContactOptions传入,Firestore无法识别自定义的UserContact对象,因此抛出Invalid argument: Instance of 'UserContact'错误。
解决方案
需要将自定义对象列表转换为Firestore可识别的Map列表,同时在反序列化时将Map列表还原为UserContact对象列表,具体修改如下:
1. 修改AnswerModel的toMap方法
将userContactOptions转换为Map<String, dynamic>列表:
Map<String, dynamic> toMap() => { 'forUserContact': forUserContact, 'userContactOptions': userContactOptions?.map((contact) => contact.toMap()).toList(), };
2. 修正AnswerModel的fromJson方法
将Firestore返回的Map列表转换为UserContact对象列表:
AnswerModel.fromJson(Map<String, dynamic> json) { id = json['id']; userContactOptions = json['userContactOptions'] == null ? null : (json['userContactOptions'] as List) .map((item) => UserContact.fromJson(item as Map<String, dynamic>)) .toList(); forUserContact = json['forUserContact'] ?? false; }
3. 修正AnswerModel的fromFirestore工厂方法
同样处理userContactOptions的反序列化:
factory AnswerModel.fromFirestore( DocumentSnapshot<Map<String, dynamic>> snapshot, SnapshotOptions? options, ) { final data = snapshot.data(); return AnswerModel( id: data?['id'], userContactOptions: data?['userContactOptions'] == null ? null : (data?['userContactOptions'] as List) .map((item) => UserContact.fromJson(item as Map<String, dynamic>)) .toList(), forUserContact: data?['forUserContact'], ); }
完成以上修改后,UserContact对象会被转换为Firestore可存储的Map结构,读取时也能正确还原为自定义对象,即可解决报错问题。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

