Json Serialized 不导入所需的类

问题描述 投票:0回答:1

这是使用https://pub.dev/packages/json_serialized继承的已知限制还是我做错了什么?我希望解决方案是不要

simply include the import manually in the correct file
。因为这是最小的可重现示例。在变化很大的大型项目中,
simply
手动执行此操作并不是那么简单。

最疯狂的部分是这是一个编译时错误。静态分析找不到这个。

main.dart

import 'foo.dart';

void main() {
  final foo = Foo.fromJson({
    "id": "1",
    "baz": {"id": "2" },
  });
  print(foo.id);
}

foo.dart

import 'package:app_core/model/bar.dart';
import 'package:app_core/repository_helper/json_map.dart';
import 'package:app_core/utils/annotations/annotations.dart';

part 'foo.g.dart';

@JsonSerializable()
class Foo extends Bar {
  final String id;

  Foo({
    required this.id,
    required super.baz,
  });

  factory Foo.fromJson(JsonMap json) => _$FooFromJson(json);

  JsonMap toJson() => _$FooToJson(this);
}

bar.dart

import 'package:app_core/model/baz.dart';
import 'package:app_core/repository_helper/json_map.dart';
import 'package:app_core/utils/annotations/annotations.dart';

part 'bar.g.dart';

@JsonSerializable()
class Bar {
  final Baz baz;

  Bar({required this.baz});

  factory Bar.fromJson(JsonMap json) => _$BarFromJson(json);

  JsonMap toJson() => _$BarToJson(this);
}

baz.dart

import 'package:app_core/repository_helper/json_map.dart';
import 'package:app_core/utils/annotations/annotations.dart';

part 'baz.g.dart';

@JsonSerializable()
class Baz {
  final String id;

  Baz({required this.id});

  factory Baz.fromJson(JsonMap json) => _$BazFromJson(json);

  JsonMap toJson() => _$BazToJson(this);
}

运行

build_runner
,然后启动
dart run main.dart

lib/model/foo.g.dart:11:12: Error: Undefined name 'Baz'.
      baz: Baz.fromJson(Map<String, dynamic>.from(json['baz'] as Map)),
           ^^^

json_map.dart

typedef JsonMap =  Map<string, dynamic>;
json flutter dart serialization
1个回答
0
投票

不幸的是,如果不涉及手动导入这些文件,就无法解决您的问题。

JsonSerialized 依赖于将生成的 {file_name}.g.dart 作为部分指令包含在输入文件 {file_name}.dart 中。由于 Dart 不支持传递导入,因此每个 Dart 文件必须显式导入它直接使用的库。

生成的文件

foo.g.dart
foo.dart
的一部分,因此依赖其导入来工作。
foo.dart
无法访问
Baz
类,除非它也直接导入包含
Baz
类的文件。

我会很高兴构建器允许使用 .g.dart 的“导入”指令而不是“部分”,然后在生成的文件中导入所需的导入...但是情况并非如此当前日期。

© www.soinside.com 2019 - 2024. All rights reserved.