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
,但我对那里了解不多。
我有一个 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
,但我对那里了解不多。