首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有freezed firestore通信的Json串行器

具有freezed firestore通信的Json串行器
EN

Stack Overflow用户
提问于 2021-05-04 16:27:43
回答 1查看 241关注 0票数 0

我正在努力在我的项目中实现购物车功能,我试图传递序列化的JSON (用冻结的包生成),但我在CartItem列表中遇到了一个问题。Error: Invalid argument (dartObject): Could not convert: Instance of '_$36_CartItem'

我的购物车模型:

代码语言:javascript
复制
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);
}

产品:

代码语言:javascript
复制
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);
}

CartItem:

代码语言:javascript
复制
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);
}

将数据传递到firestore的方法:

代码语言:javascript
复制
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'));
  }

在.g.dart中生成的toJson (所有生成的文件对于toJson都有相同的模式):

代码语言:javascript
复制
Map<String, dynamic> _$_$_UserToJson(_$_User instance) => <String, dynamic>{
      'id': instance.id,
      'email': instance.email,
      'cart': instance.cart,
    };

我认为问题出在CartItem上,在我看来,User.toJson()应该调用对象中的所有toJson方法,但我是第一次实现它,所以我真的不知道。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 17:12:50

您必须为购物车属性使用装饰器@JsonKey(fromJson: User.cartItemFromJson,toJson: User.cartItemToJson),并在您的User类中创建这两个静态方法:

代码语言:javascript
复制
part 'user.freezed.dart';
part 'user.g.dart';

@freezed
class User with _$User {
  factory User({
    required final String id,
    required final String email,
    @JsonKey(fromJson: User.cartItemFromJson, toJson: User.cartItemToJson)
    required List<CartItem> cart,
  }) = _User;

  const User._();

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  static cartItemFromJson(List<dynamic?> listOfItem) => listOfItem.isEmpty ? [] 
    : listOfItem.map((item) => CartItem.fromJson(item)).toList();

  static cartItemToJson(List<CartItem?> items) => items.isEmpty ? []
    : items.map((item) => CartItem.toJson()).toList();
}

或者,您可以创建一个实现JsonConverter的类,并将该类用作装饰器,所有信息都在冻结的文档中:https://pub.dev/packages/freezed#fromjsontojson

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67381239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档