微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Flutter、Freezed:将 Class 设置为默认值

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

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

当我运行 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,但我更愿意让冻结生成代码。有没有办法使用最新版本的冻结 (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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。