Сгенерированный класс из заморозки создает дубликат метода FromJson

У меня есть класс, который я пытаюсь использовать с 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, что является причиной ошибок. Что мне здесь не хватает?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно следующему этот комментарий в замороженном выпуске и как показано в примере файла 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 там, но у меня мало знаний об этом.

Другие вопросы по теме