Flutter、Freezed:将 Class 设置为默认值

mrg*_*t96 7 json default-value dart flutter freezed

我有一个User包含一个Purchase类的类。我想让它不可为空,但不是必需的。所以这意味着我需要设置一个默认值。

\n

我在子类(购买)中没有必填字段,并提供了默认值。

\n

当我运行 build_runner 时,我收到一条错误,指出默认值必须是文字。\n并且我知道默认值必须是常量。

\n
[SEVERE] json_serializable:json_serializable on lib/domain/user/user.model.dart:\n\nError with `@JsonKey` on `purchase`. `defaultValue` is `_$_Purchase`, it must be a literal.\npackage:clean_simple_eats/domain/user/user.model.freezed.dart:323:18\n    \xe2\x95\xb7\n323 \xe2\x94\x82   final Purchase purchase;\n    \xe2\x94\x82                  ^^^^^^^^\n    \xe2\x95\xb5\n
Run Code Online (Sandbox Code Playgroud)\n

我意识到我可以使用 @JsonKey 创建自己的 toJson 和 fromJson,但我更愿意让 freeze 生成代码。有没有办法用最新版本的 freeze (v0.14.2) 来实现这一点?

\n

用户模型文件:

\n
[SEVERE] json_serializable:json_serializable on lib/domain/user/user.model.dart:\n\nError with `@JsonKey` on `purchase`. `defaultValue` is `_$_Purchase`, it must be a literal.\npackage:clean_simple_eats/domain/user/user.model.freezed.dart:323:18\n    \xe2\x95\xb7\n323 \xe2\x94\x82   final Purchase purchase;\n    \xe2\x94\x82                  ^^^^^^^^\n    \xe2\x95\xb5\n
Run Code Online (Sandbox Code Playgroud)\n

购买文件:

\n
import \'package:clean_simple_eats/features/purchase/domain/purchase.model.dart\';\nimport \'package:freezed_annotation/freezed_annotation.dart\';\n\npart \'user.model.freezed.dart\';\npart \'user.model.g.dart\';\n\n@freezed\nclass CUser with _$CUser {\n  const CUser._();\n\n  factory CUser({\n    @Default(Purchase()) Purchase purchase,\n  }) = _CUser;\n\n  factory CUser.fromJson(Map<String, dynamic> json) => _$CUserFromJson(json);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Pav*_*vel 9

从冻结2开始,这将起作用

@freezed
class Cart with _$Cart {
  const factory Cart({
    @Default([]) List<int> items,
  }) = _Cart;

  factory Cart.fromJson(Map<String, dynamic> json) => _$CartFromJson(json);
}

@freezed
class User with _$User {
  const factory User({
    @Default(Cart()) Cart cart,
  }) = _User;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
Run Code Online (Sandbox Code Playgroud)

然后Cart.fromJson({}).items或者User.fromJson({}).cart.items会给你[]


在冻结 2 之前,请使用以下解决方法:

@Default(const Cart()) @JsonKey(fromJson: _CartFromNullableJson) Cart cart,
Run Code Online (Sandbox Code Playgroud)
Cart _CartFromNullableJson(Map<String, dynamic>? json) =>
    json == null ? Cart() : Cart.fromJson(json);
Run Code Online (Sandbox Code Playgroud)


Rob*_*erg 4

我也有同样的愿望,不幸的是更多的人已经考虑过这个问题。据我所知,这是不可能的,原因是 JsonSerialized 而不是 Freezed 本身。

在 Github 上查看此问答: https://github.com/rrousselGit/freezed/issues/149#issuecomment-616083333

我猜你写的添加@JsonKey的解决方案是这样的(OP对自己的回答)? https://github.com/rrousselGit/freezed/issues/149#issuecomment-616098286