Dart 對象映射庫發佈!

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

依賴庫

model_mapper https://pub.dev/packages/model_mapper

前言

衆所周知,雖然 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_serializableide

  1. 按照 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 }";
      }
    }
    複製代碼
  2. 建立你的 ModelMapper,並使用 ModelMapperFor 添加你但願互相映射的全部 Modelui

    import 'package:model_mapper/model_mapper.dart';
    
    part 'demo_mapper.g.dart';
    
    @ModelMapperFor([Demo1, Demo2])
    abstract class DemoMapper extends ModelMapper {
    }
    複製代碼
  3. 執行代碼生成命令this

    若是你是 Flutter 項目能夠執行 flutter packages pub run build_runner buildspa

    若是是 Dart 項目,請執行 dart pub run build_runner build

    build 換成 watch 能夠在文件變化後自動執行: pub run build_runner watch

  4. 如今能夠直接使用了。須要注意的是,實際調用的 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…

相關文章
相關標籤/搜索