У меня есть класс, который я пытаюсь использовать с Freezed, Json Serializable и 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);
}
}
После просмотра сгенерированных классов мой файл 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
, что является причиной ошибок. Что мне здесь не хватает?
Согласно следующему этот комментарий в замороженном выпуске и как показано в примере файла readme пакета, вам необходимо разместить @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);
}
}
Вы заметите, что это даст вам следующее предупреждение:
The annotation 'JsonSerializable' can only be used on classes
Это известная проблема/ограничение, и сопровождающий рекомендует отключить это конкретное предупреждение, как обсуждалось здесь.
Я считаю, что альтернативный подход состоит в том, чтобы создать build.yaml
и указать explicitToJson
там, но у меня мало знаний об этом.