Generated class from freezed 创建重复的 FromJson 方法

Generated class from freezed creates duplicate FromJson method

我有一个 class,我正尝试将其与 Freezed、Json Serializable 和 Hive 一起使用。在 运行 dart run build_runner build 并生成必要的 classes 之后,我的编译器给出了以下错误:

: Error: Can't use '_$FooBarFromJson' because it is declared more than once.

: Error: '_$FooBarFromJson' is already declared in this scope.

part 'foobar.freezed.dart';
part 'foobar.g.dart';

@freezed
@JsonSerializable(explicitToJson: true)
@HiveType(typeId: 0)
class FooBar extends HiveObject with _$FooBar  {

  factory FooBar({
    @HiveField(0) required int baz
  }) = _FooBar;

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

查看生成的 classes 后,我的 foobar.g.dart 文件包含以下方法:

FooBar _$FooBarFromJson(Map<String, dynamic> json) => FooBar(
      baz: json['baz'] as int,
    );

Map<String, dynamic> _$FooBarToJson(FooBar instance) =>
    <String, dynamic>{
      'baz': instance.baz,
    };

_$_FooBar _$$_FooBarFromJson(Map<String, dynamic> json) =>
    _$_FooBar(
      baz: json['baz'] as int,
    );

Map<String, dynamic> _$$_FooBarToJson(_$_FooBar instance) =>
    <String, dynamic>{
      'baz': instance.baz,
    };

我的 foobar.freezed.dart 包含这个方法:

FooBar _$FooBarFromJson(Map<String, dynamic> json) {
  return _FooBar.fromJson(json);
}

我注意到其他被转换的文件在 foobar.g.dart 中只有带有 _$$_ 前缀的方法,而 _$FooBarFromJson 是在 foobar.freezed.dart 中创建的和 foobar.g.dart,这是错误的原因。我在这里错过了什么?

根据下面的 this comment in a freezed issue 和包自述文件示例所示,您需要按以下方式将 @JsonSerializable(explicitToJson: true) 放在 class 中:

part 'foobar.freezed.dart';
part 'foobar.g.dart';

@freezed
@HiveType(typeId: 0)
class FooBar extends HiveObject with _$FooBar  {
  @JsonSerializable(explicitToJson: true) // <~~~ here

  factory FooBar({
    @HiveField(0) required int baz
  }) = _FooBar;


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

您会注意到这会给您以下警告:

The annotation 'JsonSerializable' can only be used on classes

这是已知的 issue/limitation,维护者建议禁用该特定警告,如讨论的那样 here

我认为另一种方法是创建 build.yaml 并在其中指定 explicitToJson,但我对那里了解不多。