`未处理的异常:无效参数:'_$_Category'的实例`将数据发送到 firestore 形成冻结的生成类时

Usa*_*rim 6 dart flutter google-cloud-firestore json-serializable freezed

我用 freeze 创建了两个模型类。一个类内部有其他类的参数。当我尝试将数据发送到 firestore 时,问题开始了。出现以下错误。

\n
E/flutter ( 6175): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Invalid argument: Instance of \'_$_Category\'\nE/flutter ( 6175): #0      convertPlatformException\npackage:cloud_firestore_platform_interface/\xe2\x80\xa6/utils/exception.dart:14\nE/flutter ( 6175): #1      MethodChannelDocumentReference.set\npackage:cloud_firestore_platform_interface/\xe2\x80\xa6/method_channel/method_channel_document_reference.dart:44\nE/flutter ( 6175): <asynchronous suspension>\nE/flutter ( 6175): #2      _JsonCollectionReference.add\npackage:cloud_firestore/src/collection_reference.dart:109\nE/flutter ( 6175): <asynchronous suspension>\nE/flutter ( 6175): #3      _WithConverterCollectionReference.add\npackage:cloud_firestore/src/collection_reference.dart:180\nE/flutter ( 6175): <asynchronous suspension>\nE/flutter ( 6175): #4      _HomeScreenState.product\npackage:mr_grocery/home/home_screen.dart:45\nE/flutter ( 6175): <asynchronous suspension>\n
Run Code Online (Sandbox Code Playgroud)\n

模型类

\n
    \n
  1. 产品(具有类别类参数)
  2. \n
\n
\n@freezed\nclass Product with _$Product {\n  const factory Product({\n    required int amount,\n    required List<Category> categories, // Category class generated by freezed\n    required String description,\n    required List<String> images,\n    required bool inStock,\n    required String name,\n    required String quantity,\n    dynamic soldQuantity,\n    dynamic createdAt,\n    dynamic updatedAt,\n    bool? exclusive,\n  }) = _Product;\n\n  factory Product.fromJson(Map<String, dynamic> json) =>\n      _$ProductFromJson(json);\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 类别
  2. \n
\n
@freezed\nclass Category with _$Category {\n  const factory Category({\n    required String image,\n    required String name,\n    // @_ColorSerlizeable() required Color? color,\n  }) = _Category;\n\n  factory Category.fromJson(Map<String, dynamic> json) =>\n      _$CategoryFromJson(json);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

使用withConverterFirestore 包

\n
  CollectionReference<Product> products() {\n    const path = FirebasePaths.products;\n    return _firestore.collection(path).withConverter<Product>(\n          fromFirestore: (snapshot, options) => Product.fromJson(\n            snapshot.data() ?? const {},\n          ),\n          toFirestore: (value, options) => value.toJson(),\n        );\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

构建.yaml

\n
targets:\n  $default:\n    builders:\n      json_serializable:\n        options:\n          # Options configure how source code is generated for every\n          # `@JsonSerializable`-annotated class in the package.\n          #\n          # The default value for each is listed.\n          any_map: false\n          checked: false\n          constructor: ""\n          create_factory: true\n          create_to_json: true\n          disallow_unrecognized_keys: false\n          explicit_to_json: true // -- Specified to true\n          field_rename: none\n          generic_argument_factories: false\n          ignore_unannotated: false\n          include_if_null: true\n
Run Code Online (Sandbox Code Playgroud)\n

Vic*_*oco 3

它的行为就像explicit_to_json: false,因为它试图对您的类进行编码并且不与嵌套一起操作toJson

在你的顶级类上,它生成的toJson应该是这样的:

{
  "myNestedClass": myNestedClass.toJson(),
{
Run Code Online (Sandbox Code Playgroud)

代替

{
  "myNestedClass": myNestedClass,
{
Run Code Online (Sandbox Code Playgroud)

这导致了这次崩溃。

尝试理解为什么你的explicit_to_json: true不工作。您可以留下更多详细信息,以便我可以更积极地帮助您。

您是否添加part 'product.g.dart';来生成json_serializable代码?

另外,如果您正在使用 Firebase,请考虑设置any_map: true,因为 Firebase 结构可能有 aMap<dynamic, dynamic>而不是 only Map<String, Object?>