【问题标题】:Generated class from freezed creates duplicate FromJson method从冻结生成的类创建重复的 FromJson 方法
【发布时间】:2022-08-06 14:16:17
【问题描述】:

我有一个类,我试图将它与 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.dartfoobar.g.dart 中创建的,这是错误的原因.我在这里想念什么?

    标签: flutter hive freezed json-serializable


    【解决方案1】:

    根据下面的this comment in a freezed issue 和包自述文件示例中所示,您需要将@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
    

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多