在應用程序中,一般會有一些類似,可是又不一樣的對象模型,其中兩個模型中的數據可能類似,可是模型的結構和關注點不一樣。經過對象映射,能夠十分方便的將一個模型轉換爲另外一個模型,從而使得分離的模型保持隔離的狀態。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…