Flutter, Freezed:设置 Class 为默认值
Flutter, Freezed: Set Class as default value
我有一个 User
class,其中包含一个 Purchase
class。我想让它不可为空,但不是必需的。所以这意味着我需要设置一个默认值。
我在子class(购买)中没有必填字段,并提供了默认值。
当我 运行 build_runner 时,我收到一条错误消息,提示默认值必须是文字。
而且我知道默认值必须是一个常量。
[SEVERE] json_serializable:json_serializable on lib/domain/user/user.model.dart:
Error with `@JsonKey` on `purchase`. `defaultValue` is `_$_Purchase`, it must be a literal.
package:clean_simple_eats/domain/user/user.model.freezed.dart:323:18
╷
323 │ final Purchase purchase;
│ ^^^^^^^^
╵
我意识到我可以使用@JsonKey 创建自己的 toJson 和 fromJson,但我更愿意让 freezed 生成代码。有没有办法用最新版本的 freezed (v0.14.2) 来实现这一点?
用户模型文件:
import 'package:clean_simple_eats/features/purchase/domain/purchase.model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.model.freezed.dart';
part 'user.model.g.dart';
@freezed
class CUser with _$CUser {
const CUser._();
factory CUser({
@Default(Purchase()) Purchase purchase,
}) = _CUser;
factory CUser.fromJson(Map<String, dynamic> json) => _$CUserFromJson(json);
}
购买文件:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'purchase.model.freezed.dart';
part 'purchase.model.g.dart';
@freezed
class Purchase with _$Purchase {
const factory Purchase({
@Default(false) bool isSubscribed,
}) = _Purchase;
factory Purchase.fromJson(Map<String, dynamic> json) =>
_$PurchaseFromJson(json);
}
我也有过同样的愿望,不幸的是更多人想到了。据我所知,这是不可能的,原因是 JsonSerializable 而不是 Freezed 本身。
在 Github 上查看此问答:
https://github.com/rrousselGit/freezed/issues/149#issuecomment-616083333
我猜你写的添加@JsonKey 的解决方案是这样的(OP 对自己的回答)?
https://github.com/rrousselGit/freezed/issues/149#issuecomment-616098286
从冻结 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);
}
然后Cart.fromJson({}).items
或User.fromJson({}).cart.items
会给你[]
在冻结 2 之前,使用此解决方法:
@Default(const Cart()) @JsonKey(fromJson: _CartFromNullableJson) Cart cart,
Cart _CartFromNullableJson(Map<String, dynamic>? json) =>
json == null ? Cart() : Cart.fromJson(json);
我有一个 User
class,其中包含一个 Purchase
class。我想让它不可为空,但不是必需的。所以这意味着我需要设置一个默认值。
我在子class(购买)中没有必填字段,并提供了默认值。
当我 运行 build_runner 时,我收到一条错误消息,提示默认值必须是文字。 而且我知道默认值必须是一个常量。
[SEVERE] json_serializable:json_serializable on lib/domain/user/user.model.dart:
Error with `@JsonKey` on `purchase`. `defaultValue` is `_$_Purchase`, it must be a literal.
package:clean_simple_eats/domain/user/user.model.freezed.dart:323:18
╷
323 │ final Purchase purchase;
│ ^^^^^^^^
╵
我意识到我可以使用@JsonKey 创建自己的 toJson 和 fromJson,但我更愿意让 freezed 生成代码。有没有办法用最新版本的 freezed (v0.14.2) 来实现这一点?
用户模型文件:
import 'package:clean_simple_eats/features/purchase/domain/purchase.model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.model.freezed.dart';
part 'user.model.g.dart';
@freezed
class CUser with _$CUser {
const CUser._();
factory CUser({
@Default(Purchase()) Purchase purchase,
}) = _CUser;
factory CUser.fromJson(Map<String, dynamic> json) => _$CUserFromJson(json);
}
购买文件:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'purchase.model.freezed.dart';
part 'purchase.model.g.dart';
@freezed
class Purchase with _$Purchase {
const factory Purchase({
@Default(false) bool isSubscribed,
}) = _Purchase;
factory Purchase.fromJson(Map<String, dynamic> json) =>
_$PurchaseFromJson(json);
}
我也有过同样的愿望,不幸的是更多人想到了。据我所知,这是不可能的,原因是 JsonSerializable 而不是 Freezed 本身。
在 Github 上查看此问答: https://github.com/rrousselGit/freezed/issues/149#issuecomment-616083333
我猜你写的添加@JsonKey 的解决方案是这样的(OP 对自己的回答)? https://github.com/rrousselGit/freezed/issues/149#issuecomment-616098286
从冻结 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);
}
然后Cart.fromJson({}).items
或User.fromJson({}).cart.items
会给你[]
在冻结 2 之前,使用此解决方法:
@Default(const Cart()) @JsonKey(fromJson: _CartFromNullableJson) Cart cart,
Cart _CartFromNullableJson(Map<String, dynamic>? json) =>
json == null ? Cart() : Cart.fromJson(json);