在应用程序中,一般会有一些类似,可是又不一样的对象模型,其中两个模型中的数据可能类似,可是模型的结构和关注点不一样。经过对象映射,能够十分方便的将一个模型转换为另外一个模型,从而使得分离的模型保持隔离的状态。git
众所周知,虽然 Dart 支持反射,可是 Flutter 禁用了 Dart 的反射能力,因此像 Java 中一些须要用反射来实现的骚操做就不能用了。因而通过短暂的思考,决定用序列化和反序列化来实现对象映射。github
我认可我有偷懒的成分,本该本身完成序列化代码的,可是由于时间问题,我在 json_serializable
的基础上实现了对象映射。这样虽然开发方便了,可是使用起来稍微麻烦了一些。json
后面我会逐渐补上序列化部分的代码。若是哪位同窗有兴趣,也能够来 Github 一块儿创做。markdown
将下面的依赖添加到你的 pubspec.yaml
中:app
dependencies:
model_mapper: ^0.0.1
dev_dependencies:
build_runner: ^1.10.3
json_serializable: ^4.0.0
model_mapper_generator: ^0.1.0
复制代码
model_mapper
是在 json_serializable
的基础上运行的,因此第一步应该先配置json_serializable
ide
按照 json_serializable
的要求配置你的 Model:oop
import 'package:json_annotation/json_annotation.dart';
part 'demo.g.dart';
@JsonSerializable()
class Demo1 {
final String a;
final String b;
Demo1(this.b, {required this.a});
factory Demo1.fromJson(Map<String, dynamic> json) => _$Demo1FromJson(json);
Map<String, dynamic> toJson() => _$Demo1ToJson(this);
}
@JsonSerializable()
class Demo2 {
final String a;
final String b;
Demo2(this.a, this.b);
factory Demo2.fromJson(Map<String, dynamic> json) => _$Demo2FromJson(json);
Map<String, dynamic> toJson() => _$Demo2ToJson(this);
@override
String toString() {
return "Demo2 { a: $a, b: $b }";
}
}
复制代码
建立你的 ModelMapper
,并使用 ModelMapperFor
添加你但愿互相映射的全部 Model。ui
import 'package:model_mapper/model_mapper.dart';
part 'demo_mapper.g.dart';
@ModelMapperFor([Demo1, Demo2])
abstract class DemoMapper extends ModelMapper {
}
复制代码
执行代码生成命令this
若是你是 Flutter 项目能够执行 flutter packages pub run build_runner build
。spa
若是是 Dart 项目,请执行 dart pub run build_runner build
。
将 build
换成 watch
能够在文件变化后自动执行: pub run build_runner watch
。
如今能够直接使用了。须要注意的是,实际调用的 ModelMapper 的类名是在你定义的 ModelMapper
类名前加一个 $
,好比你定义的是 DemoMapper
,那你应该调用 $DemoMapper
var demo1 = Demo1("b", a: "a");
var demo2 = $DemoMapper.instance().map(demo1, Demo2);
print(demo2);
// output: Demo2: { a: a, b: b }
复制代码
Github 地址:github.com/T-Oner/mode…