Flutter数据映射生成插件dart_mapper_generator的使用

Flutter数据映射生成插件dart_mapper_generator的使用

dart_mapper_generator 是一个用于在Dart项目中自动生成数据映射代码的插件。它可以帮助开发者简化数据模型与JSON之间的转换过程,从而提高开发效率。

安装插件

首先,在你的pubspec.yaml文件中添加dart_mapper_generator依赖:

dev_dependencies:
  build_runner: ^2.0.0
  dart_mapper_generator: ^1.0.0

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

创建数据模型

假设我们有一个简单的用户数据模型,包含idnameemail三个属性。

class User {
  final int id;
  final String name;
  final String email;

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

生成映射代码

接下来,我们需要创建一个映射文件来定义如何将JSON转换为User对象。创建一个新的文件user.mapper.dart

import 'package:dart_mapper_generator/dart_mapper_generator.dart';

@Mapper()
class UserMapper {
  static User fromJson(Map<String, dynamic> json) => User(
        id: json['id'],
        name: json['name'],
        email: json['email'],
      );

  static Map<String, dynamic> toJson(User user) => {
        'id': user.id,
        'name': user.name,
        'email': user.email,
      };
}

使用映射器

现在,你可以在应用的任何地方使用UserMapper类来进行JSON和User对象之间的转换。

void main() {
  // JSON字符串
  String jsonString = '{"id": 1, "name": "John Doe", "email": "john.doe@example.com"}';

  // 将JSON字符串解析为Map
  Map<String, dynamic> json = jsonDecode(jsonString);

  // 使用UserMapper将JSON转换为User对象
  User user = UserMapper.fromJson(json);
  
  print(user.name); // 输出: John Doe

  // 将User对象转换回JSON
  Map<String, dynamic> userJson = UserMapper.toJson(user);
  
  print(userJson); // 输出: {id: 1, name: John Doe, email: john.doe@example.com}
}

运行构建任务

为了使生成器生效,你需要运行以下命令来生成映射代码:

flutter packages pub run build_runner build

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

1 回复

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


dart_mapper_generator 是一个用于生成 Dart 数据映射代码的代码生成插件。它可以帮助开发者自动生成将 JSON 数据映射到 Dart 对象的代码,从而减少手动编写映射代码的工作量。以下是使用 dart_mapper_generator 的基本步骤:

1. 添加依赖

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

dependencies:
  json_annotation: ^4.8.0

dev_dependencies:
  build_runner: ^2.3.3
  json_serializable: ^6.7.1
  dart_mapper_generator: ^1.0.0

json_annotationjson_serializable 是常用的 JSON 序列化库,dart_mapper_generator 通常与它们一起使用。

2. 创建数据模型类

创建一个 Dart 类,并使用 [@JsonSerializable](/user/JsonSerializable) 注解标记它。这个类将作为 JSON 数据的模型。

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

[@JsonSerializable](/user/JsonSerializable)()
class User {
  final String name;
  final int age;
  final String email;

  User({required this.name, required this.age, required this.email});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3. 生成映射代码

运行 build_runner 命令来生成映射代码。

flutter pub run build_runner build

这将在同一目录下生成一个名为 user.g.dart 的文件,其中包含 _$UserFromJson_$UserToJson 方法的实现。

4. 使用生成的代码

现在你可以使用生成的 fromJsontoJson 方法来将 JSON 数据映射到 Dart 对象,或者将 Dart 对象序列化为 JSON。

void main() {
  final json = {
    'name': 'John Doe',
    'age': 30,
    'email': 'john.doe@example.com'
  };

  final user = User.fromJson(json);
  print(user.name); // 输出: John Doe

  final userJson = user.toJson();
  print(userJson); // 输出: {name: John Doe, age: 30, email: john.doe@example.com}
}

5. 使用 dart_mapper_generator

dart_mapper_generator 提供了额外的功能,例如自定义映射逻辑。你可以在模型类中使用 [@Mapper](/user/Mapper) 注解来指定自定义映射逻辑。

import 'package:dart_mapper_generator/dart_mapper_generator.dart';

part 'user.g.dart';

[@JsonSerializable](/user/JsonSerializable)()
[@Mapper](/user/Mapper)()
class User {
  final String name;
  final int age;
  final String email;

  User({required this.name, required this.age, required this.email});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  Map<String, dynamic> toJson() => _$UserToJson(this);
}

然后再次运行 build_runner 命令来生成代码。

flutter pub run build_runner build

6. 自定义映射逻辑

你可以在 Mapper 注解中指定自定义的映射逻辑。例如:

[@JsonSerializable](/user/JsonSerializable)()
[@Mapper](/user/Mapper)(
  fromJson: '''
  return User(
    name: json['full_name'] as String,
    age: json['user_age'] as int,
    email: json['user_email'] as String,
  );
  ''',
  toJson: '''
  return {
    'full_name': instance.name,
    'user_age': instance.age,
    'user_email': instance.email,
  };
  ''',
)
class User {
  final String name;
  final int age;
  final String email;

  User({required this.name, required this.age, required this.email});
}
回到顶部