Flutter数据映射插件dart_mappable的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter数据映射插件dart_mappable的使用

dart_mappable 是一个用于 Dart 和 Flutter 的数据映射库,它简化了 JSON 序列化和反序列化的过程,并提供了对泛型、继承、多态等复杂用例的支持。本文将详细介绍如何在 Flutter 项目中使用 dart_mappable,并提供一个完整的示例。

快速开始

添加依赖

首先,在你的 pubspec.yaml 文件中添加 dart_mappable 作为依赖项,并添加 build_runnerdart_mappable_builder 作为开发依赖项:

dependencies:
  dart_mappable: ^latest_version

dev_dependencies:
  build_runner: ^latest_version
  dart_mappable_builder: ^latest_version

然后运行以下命令来安装这些包:

flutter pub add dart_mappable
flutter pub add build_runner --dev
flutter pub add dart_mappable_builder --dev

定义模型类

接下来,创建一个 Dart 文件(例如 model.dart),并在其中定义你要使用的模型类。使用 @MappableClass() 注解这些类,并添加适当的 part 指令以包含生成的 .mapper.dart 文件。

// model.dart
import 'package:dart_mappable/dart_mappable.dart';

part 'model.mapper.dart';

@MappableClass()
class Person with PersonMappable {
  final String name;
  final int age;
  final Car? car;

  Person(this.name, {this.age = 18, this.car});
}

@MappableEnum()
enum Brand { Toyota, Audi, BMW }

@MappableClass()
class Car with CarMappable {
  final double miles;
  final Brand brand;

  const Car(this.miles, this.brand);
}

生成代码

为了生成序列化代码,运行以下命令:

dart pub run build_runner build

如果你在开发过程中频繁修改模型类,可以使用 watch 命令自动监视更改:

dart pub run build_runner watch

使用生成的映射器

最后一步是使用生成的映射器进行序列化和反序列化操作。以下是几个常见的用法示例:

void main() {
  // 解码 JSON 字符串
  String json = '{"name": "Max", "car": {"miles": 1000, "brand": "Audi"}}';
  Person person = PersonMapper.fromJson(json);

  // 使用 toString()
  print(person); // Person(name: Max, age: 18, car: Car(miles: 1000.0, brand: Brand.Audi))

  // 创建副本
  Person person2 = person.copyWith(name: 'Anna', age: 20);
  print(person2); // Person(name: Anna, age: 20, car: ...)

  // 编码为 Map
  Map<String, dynamic> map = person.toMap();
  print(map); // {name: Max, age: 18, car: {miles: 1000, brand: Audi}}

  // 从 Map 解码
  Person person3 = PersonMapper.fromMap(map);
  print(person3); // Person(name: Max, age: 18, car: ...)

  // 检查相等性
  print(person3 == person); // true

  // 直接转换为 JSON 字符串
  print(person3.toJson()); // '{"name":"Max","age":18,"car":{"miles":1000,"brand":"Audi"}}'

  // 确保 Confetti 可以被序列化
  ConfettiMapper.ensureInitialized();

  // 使用泛型对象
  var box = Box<Confetti>(10, content: Confetti('Rainbow'));
  String boxJson = box.toJson();
  print(boxJson); // {"size":10,"content":{"color":"Rainbow"}}

  // ... 在其他地方
  dynamic whatAmI = BoxMapper.fromJson<Confetti>(boxJson);
  print(whatAmI.runtimeType); // Box<Confetti>

  // 也适用于列表和集合
  List<int> numbers = MapperContainer.globals.fromJson('[2, 4, 105]');
  print(numbers); // [2, 4, 105]
}

示例代码

下面是一个完整的示例代码,展示了如何使用 dart_mappable 进行数据映射:

import 'package:dart_mappable/dart_mappable.dart';

part 'main.mapper.dart';

@MappableClass()
class Person with PersonMappable {
  final String name;
  final int age;
  final Car? car;

  Person(this.name, {this.age = 18, this.car});
}

@MappableEnum()
enum Brand { Toyota, Audi, BMW }

@MappableClass()
class Car with CarMappable {
  final double miles;
  final Brand brand;

  const Car(this.miles, this.brand);
}

@MappableClass()
class Box<T> with BoxMappable<T> {
  int size;
  T content;

  Box(this.size, {required this.content});
}

@MappableClass()
class Confetti with ConfettiMappable {
  String color;
  Confetti(this.color);
}

void main() {
  // 解码 JSON 字符串
  String json = '{"name": "Max", "car": {"miles": 1000, "brand": "Audi"}}';
  Person person = PersonMapper.fromJson(json);

  // 使用 toString()
  print(person);
  // Person(name: Max, age: 18, car: Car(miles: 1000.0, brand: Brand.Audi))

  // 创建副本
  Person person2 = person.copyWith(name: 'Anna', age: 20);
  print(person2); // Person(name: Anna, age: 20, car: ...

  // 编码为 Map
  Map<String, dynamic> map = person.toMap();
  print(map); // {name: Max, age: 18, car: {miles: 1000, brand: Audi}}

  // 从 Map 解码
  Person person3 = PersonMapper.fromMap(map);
  print(person3); // Person(name: Max, age: 18, car: ...

  // 检查相等性
  print(person3 == person); // true

  // 直接转换为 JSON 字符串
  print(person3.toJson()); // '{"name":"Max","age":18,"car":{"miles":1000,"brand":"Audi"}}'

  // 确保 Confetti 可以被序列化
  ConfettiMapper.ensureInitialized();

  // 使用泛型对象
  var box = Box<Confetti>(10, content: Confetti('Rainbow'));
  String boxJson = box.toJson();
  print(boxJson); // {"size":10,"content":{"color":"Rainbow"}}

  // ... 在其他地方
  dynamic whatAmI = BoxMapper.fromJson<Confetti>(boxJson);
  print(whatAmI.runtimeType); // Box<Confetti>

  // 也适用于列表和集合
  List<int> numbers = MapperContainer.globals.fromJson('[2, 4, 105]');
  print(numbers); // [2, 4, 105]
}

通过以上步骤和示例代码,你应该能够在 Flutter 项目中成功使用 dart_mappable 进行数据映射。更多详细信息和高级用法,请参考 官方文档


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用dart_mappable插件进行数据映射的示例代码。dart_mappable是一个帮助在Dart对象之间进行映射的库,这在处理JSON数据或在不同数据模型间转换时特别有用。

首先,确保你已经在pubspec.yaml文件中添加了dart_mappable依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_mappable: ^x.y.z  # 请使用最新版本号替换x.y.z

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

接下来,我们来看一个具体的代码示例。

假设我们有两个数据模型UserModelUserDto,并且我们希望在这两个模型之间进行映射。

定义模型

import 'package:dart_mappable/dart_mappable.dart';

// 定义源模型
@MappableClass()
class UserModel {
  String id;
  String name;
  int age;

  // 构造函数
  UserModel({required this.id, required this.name, required this.age});
}

// 定义目标模型
@MappableClass()
class UserDto {
  String userId;
  String fullName;
  int userAge;

  // 构造函数
  UserDto({required this.userId, required this.fullName, required this.userAge});
}

创建映射器

接下来,我们需要创建一个映射器类来定义如何从UserModel映射到UserDto

import 'package:dart_mappable/dart_mappable.dart';
import 'user_model.dart';
import 'user_dto.dart';

class UserMapper extends Mapper<UserModel, UserDto> {
  @override
  UserDto map(UserModel source) {
    return UserDto(
      userId: source.id,
      fullName: source.name,
      userAge: source.age,
    );
  }
}

使用映射器

现在我们可以使用这个映射器将UserModel实例转换为UserDto实例。

void main() {
  // 创建一个UserModel实例
  UserModel userModel = UserModel(
    id: '123',
    name: 'John Doe',
    age: 30,
  );

  // 创建映射器实例
  UserMapper userMapper = UserMapper();

  // 执行映射
  UserDto userDto = userMapper.map(userModel);

  // 打印结果
  print('User ID: ${userDto.userId}');
  print('Full Name: ${userDto.fullName}');
  print('User Age: ${userDto.userAge}');
}

输出

User ID: 123
Full Name: John Doe
User Age: 30

注意事项

  1. 字段匹配:确保源模型和目标模型中的字段匹配,或者映射器中的映射逻辑正确。
  2. 依赖注入:在实际应用中,你可能会使用依赖注入来管理映射器的创建,这样可以更好地控制依赖关系和生命周期。
  3. 错误处理:在更复杂的映射逻辑中,添加适当的错误处理是很重要的。

通过上述步骤,你已经学会了如何在Flutter项目中使用dart_mappable插件进行数据映射。希望这个示例对你有所帮助!

回到顶部