这是使用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>;
不幸的是,如果不涉及手动导入这些文件,就无法解决您的问题。
JsonSerialized 依赖于将生成的 {file_name}.g.dart 作为部分指令包含在输入文件 {file_name}.dart 中。由于 Dart 不支持传递导入,因此每个 Dart 文件必须显式导入它直接使用的库。
生成的文件
foo.g.dart
是 foo.dart
的一部分,因此依赖其导入来工作。 foo.dart
无法访问 Baz
类,除非它也直接导入包含 Baz
类的文件。
我会很高兴构建器允许使用 .g.dart 的“导入”指令而不是“部分”,然后在生成的文件中导入所需的导入...但是情况并非如此当前日期。