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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:03:33