Firebase Json序列化程序与冻结firestore通信

Firebase Json序列化程序与冻结firestore通信,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我正在努力在我的项目中实现cart功能,我正在尝试传递序列化的JSON(使用冻结的包生成),但是我在CartItem列表中遇到了问题错误:无效参数(dartObject):无法转换“\u36\u CartItem”的实例。 我的购物车模型: part 'user.freezed.dart'; part 'user.g.dart'; @freezed class User with _$User { factory User({ required final String id,

我正在努力在我的项目中实现cart功能,我正在尝试传递序列化的JSON(使用冻结的包生成),但是我在
CartItem
列表中遇到了问题<代码>错误:无效参数(dartObject):无法转换“\u36\u CartItem”的实例。

我的购物车模型:

part 'user.freezed.dart';
part 'user.g.dart';

@freezed
class User with _$User {
  factory User({
    required final String id,
    required final String email,
    required List<CartItem> cart,
  }) = _User;

  const User._();

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
我认为问题在于
CartItem
在我看来
User.toJson()
应该调用对象中的所有toJson方法,但我是第一次实现它,所以我真的不知道


我是否应该在User中编写自己的toJson,然后调用build runner并冻结将重新生成新的toJson?

您必须使用decorator@JsonKey(fromJson:User.cartItemFromJson,toJson:User.cartItemToJson)作为cart属性,并在用户类中创建这两个静态方法:

部分“user.freezed.dart”;
“用户g.dart”部分;
@冻结
使用$User初始化用户{
工厂用户({
所需的最终字符串id,
所需的最终字符串电子邮件,
@JsonKey(fromJson:User.cartItemFromJson,toJson:User.cartItemToJson)
所需列表购物车,
})=\u用户;
常量用户;
factory User.fromJson(Map json)=>$UserFromJson(json);
静态cartItemFromJson(List ListoItem)=>ListoItem.isEmpty?[]
:listOfItem.map((item)=>CartItem.fromJson(item)).toList();
静态cartItemToJson(列表项)=>items.isEmpty?[]
:items.map((item)=>CartItem.toJson()).toList();
}

或者您可以创建一个实现JsonConverter的类,并将该类用作装饰器,所有信息都在冻结的文档中:

CartItem.toJson()
应该是什么样子?因为目前,我在这方面有错误。我把它改成了一个项目!。但是现在这个错误只是产品转换器问题的一个实例。所以我也应该在CartItem中写些东西,对吗?错误是没有方法好的,我已经弄明白了,非常感谢!
part 'product.freezed.dart';
part 'product.g.dart';

@freezed
class Product with _$Product {
  factory Product({
    required final String id, 
    required final String name, 
    required final double price, 
    required final bool isBestseller, 
    required final String description, 
    required final String imageUrl, 
  }) = _Product;

  const Product._();

  factory Product.fromJson(Map<String, dynamic> json) =>
      _$ProductFromJson(json);
}
part 'cart_item.freezed.dart';
part 'cart_item.g.dart';

@freezed
class CartItem with _$CartItem {
  factory CartItem({
    required final Product product,
    required int quantity,
  }) = _CartItem;

  const CartItem._();

  factory CartItem.fromJson(Map<String, dynamic> json) =>
      _$CartItemFromJson(json);
}
Future<void> firebaseCreateUser(firebase_auth.User user) async {
    CollectionReference users = FirebaseFirestore.instance.collection('users');
    List<CartItem> test = [
      CartItem(product: MockData.mockProducts.elementAt(0), quantity: 2),
      CartItem(product: MockData.mockProducts.elementAt(1), quantity: 2)
    ];
    return users
        .doc(user.uid)
        .set(User(cart: test, email: user.email!, id: user.uid).toJson())
        .catchError((e) => print('Failed to add user: $e'));
  }
Map<String, dynamic> _$_$_UserToJson(_$_User instance) => <String, dynamic>{
      'id': instance.id,
      'email': instance.email,
      'cart': instance.cart,
    };