mrg*_*t96 7 json default-value dart flutter freezed
我有一个User包含一个Purchase类的类。我想让它不可为空,但不是必需的。所以这意味着我需要设置一个默认值。
我在子类(购买)中没有必填字段,并提供了默认值。
\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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n购买文件:
\nimport \'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}\nRun Code Online (Sandbox Code Playgroud)\n
从冻结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)
我也有同样的愿望,不幸的是更多的人已经考虑过这个问题。据我所知,这是不可能的,原因是 JsonSerialized 而不是 Freezed 本身。
在 Github 上查看此问答: https://github.com/rrousselGit/freezed/issues/149#issuecomment-616083333
我猜你写的添加@JsonKey的解决方案是这样的(OP对自己的回答)? https://github.com/rrousselGit/freezed/issues/149#issuecomment-616098286
| 归档时间: |
|
| 查看次数: |
9501 次 |
| 最近记录: |