Flutter数据模型映射插件model_mapper的使用

Flutter数据模型映射插件model_mapper的使用

简介

model_mapper 是一个用于Dart智能对象映射的库。

示例

要了解如何使用它,最好的方法是查看示例

安装

在你的 pubspec.yaml 文件中添加以下依赖项:

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 运行。

步骤 1: 配置你的模型

首先你需要通过 json_serializable 配置你的模型。

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});

  // 从JSON生成实例
  factory Demo1.fromJson(Map<String, dynamic> json) => _$Demo1FromJson(json);

  // 将实例转换为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);

  // 重写toString方法以便打印
  @override
  String toString() {
    return "Demo2 { a: $a, b: $b }";
  }
}

步骤 2: 创建你的ModelMapper

接下来创建你的 ModelMapper。注意 ModelMapperFor 注解必须包含所有你想映射的模型。

import 'package:model_mapper/model_mapper.dart';

part 'demo_mapper.g.dart';

// 指定需要映射的模型
@ModelMapperFor([Demo1, Demo2])
abstract class DemoMapper extends ModelMapper {
}

步骤 3: 运行代码生成器

运行生成器命令:

flutter packages pub run build_runner build

如果你希望每次文件更改时自动运行生成器,可以使用:

flutter packages pub run build_runner watch

步骤 4: 使用生成的代码

生成的映射器名称由 $ 和你的映射器类名组成。

var demo1 = Demo1("b", a: "a");

var demo2 = $DemoMapper.instance().map(demo1, Demo2);
print(demo2);
// 输出: Demo2 { a: a, b: b }

Bug反馈与建议

请在 GitHub Issues 上提交问题或建议。


下面是完整的示例代码:

import 'demo.dart';
import 'demo_mapper.dart';

void main() {
  var demo = Demo1("b", a: "a");

  var test = $DemoMapper.instance().map(demo, Demo2);
  print(test);
}

更多关于Flutter数据模型映射插件model_mapper的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据模型映射插件model_mapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


model_mapper 是一个用于 Flutter 的插件,它可以帮助开发者将 JSON 数据映射到 Dart 的数据模型中。通过使用这个插件,开发者可以更方便地处理网络请求或其他来源的 JSON 数据,并将其转换为强类型的 Dart 对象。

安装 model_mapper

首先,你需要在 pubspec.yaml 文件中添加 model_mapper 依赖:

dependencies:
  flutter:
    sdk: flutter
  model_mapper: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 model_mapper

1. 创建数据模型

假设你有一个 JSON 数据如下:

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com"
}

你可以创建一个对应的 Dart 数据模型类:

import 'package:model_mapper/model_mapper.dart';

class User with ModelMapper {
  int id;
  String name;
  String email;

  User({this.id, this.name, this.email});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }
}

2. 使用 ModelMapper 进行映射

ModelMapper 提供了一个 fromJson 方法,可以将 JSON 数据映射到 Dart 对象:

void main() {
  Map<String, dynamic> json = {
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com"
  };

  User user = User.fromJson(json);

  print(user.name);  // 输出: John Doe
}

3. 将 Dart 对象转换回 JSON

你也可以将 Dart 对象转换回 JSON 数据:

void main() {
  User user = User(id: 1, name: "John Doe", email: "john.doe@example.com");

  Map<String, dynamic> json = user.toJson();

  print(json);  // 输出: {id: 1, name: John Doe, email: john.doe@example.com}
}

高级用法

model_mapper 还支持嵌套对象、列表等复杂数据结构的映射。例如,如果你有一个包含嵌套对象的 JSON 数据:

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com",
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "zipcode": "10001"
  }
}

你可以这样定义数据模型:

class Address with ModelMapper {
  String street;
  String city;
  String zipcode;

  Address({this.street, this.city, this.zipcode});

  factory Address.fromJson(Map<String, dynamic> json) {
    return Address(
      street: json['street'],
      city: json['city'],
      zipcode: json['zipcode'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'street': street,
      'city': city,
      'zipcode': zipcode,
    };
  }
}

class User with ModelMapper {
  int id;
  String name;
  String email;
  Address address;

  User({this.id, this.name, this.email, this.address});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
      address: Address.fromJson(json['address']),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
      'address': address.toJson(),
    };
  }
}
回到顶部