从 freeze 生成的类创建重复的 FromJson 方法

Fli*_*lik 5 hive flutter json-serializable freezed

我有一个类,我试图将其与 Freezed、Json Serialized 和 Hive 一起使用。运行dart run build_runner build并生成必要的类后,我的编译器给出以下错误:

: 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

查看生成的类后,我的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,
    };
Run Code Online (Sandbox Code Playgroud)

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

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

我注意到转换的其他文件仅具有前缀为_$$_in的方法foobar.g.dart,而在和_$FooBarFromJson中创建,这是错误的原因。我在这里缺少什么?foobar.freezed.dartfoobar.g.dart

osa*_*xma 9

根据冻结问题中的以下注释以及包自述文件示例中所示,您需要@JsonSerializable(explicitToJson: true)按以下方式将其放置在类内部:

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);
  }
}

Run Code Online (Sandbox Code Playgroud)

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

The annotation 'JsonSerializable' can only be used on classes
Run Code Online (Sandbox Code Playgroud)

这是一个已知问题/限制,维护者建议禁用该特定警告,如此处所述

我相信另一种方法是在那里创建build.yaml和指定explicitToJson,但我在那里没有太多知识。