Flutter数据映射插件simple_mapper的使用

Flutter数据映射插件simple_mapper的使用

介绍

simple_mapper 是一个用于简化不同类型对象之间映射的Flutter插件。通过配置表达式,它可以减少映射对象所需的代码量。本文将详细介绍如何使用 simple_mapper 进行对象映射,并提供一个完整的示例demo。

使用方法

简单的1对1映射

可以通过传递一个回调函数来添加映射配置,该回调函数接受源对象和映射器作为参数,并返回目标对象。

var mapper = Mapper()
  .addMap<CompanyB, CompanyA>((source, mapper) => CompanyB(
      id: source.id,
      name: source.name,
    ));

var companyA = CompanyA(
  id: 1,
  name: 'ABC',
);

var companyB = mapper.map<CompanyB, CompanyA>(companyA);

映射子对象

在回调函数中可以使用映射器来映射子对象。

var mapper = Mapper()
  .addMap<CompanyB, CompanyA>((source, mapper, [params]) => CompanyB(
    id: source.id,
    name: source.name,
    employees: source.employees
      ?.map((employee) => mapper.map<EmployeeB, EmployeeA>(employee))
      ?.toList(),
  ))
  .addMap<EmployeeB, EmployeeA>((source, mapper, [params]) => EmployeeB(
    id: source.id,
    name: source.name,
    startDate: source.startDate,
    timeEmployed: source.startDate == null || source.endDate == null ?
      null :
      source.endDate.difference(source.startDate),
    company: mapper.map<CompanyB, CompanyA>(source.company),
  ));

映射null

如果源对象为null,则不会执行回调函数,map 方法会直接返回null。

var company = mapper.map<CompanyB, CompanyA>(null);
print(company == null); // true

映射附加参数

在某些情况下,源对象可能不包含所有需要映射到目标对象的数据。这时可以传递附加参数。

var mapper = Mapper()
  .addMap<CompanyB, CompanyA>((source, mapper, [params]) => CompanyB(
    id: source.id,
    name: source.name,
    employees: source.employees
      ?.map((employee) => mapper.map<EmployeeB, EmployeeA>(employee, {
        'companyId': source.id,
      }))
      ?.toList(),
  ))
  .addMap<EmployeeB, EmployeeA>((source, mapper, [params]) => EmployeeB(
    id: source.id,
    companyId: params != null ? params['companyId'] : null,
    name: source.name,
    startDate: source.startDate,
    timeEmployed: source.startDate == null || source.endDate == null ?
      null :
      source.endDate.difference(source.startDate),
  ));

完整示例Demo

以下是一个完整的示例demo,展示了如何使用 simple_mapper 进行对象映射。

import 'package:simple_mapper/simple_mapper.dart';

// 定义模型类
class CompanyA {
  final int id;
  final String name;
  final List<EmployeeA>? employees;

  CompanyA({required this.id, required this.name, this.employees});

  [@override](/user/override)
  String toString() {
    return 'CompanyA{id: $id, name: $name, employees: $employees}';
  }
}

class CompanyB {
  final int id;
  final String name;
  final List<EmployeeB>? employees;

  CompanyB({required this.id, required this.name, this.employees});

  [@override](/user/override)
  String toString() {
    return 'CompanyB{id: $id, name: $name, employees: $employees}';
  }
}

class EmployeeA {
  final int id;
  final String name;
  final DateTime? startDate;
  final DateTime? endDate;

  EmployeeA({required this.id, required this.name, this.startDate, this.endDate});

  [@override](/user/override)
  String toString() {
    return 'EmployeeA{id: $id, name: $name, startDate: $startDate, endDate: $endDate}';
  }
}

class EmployeeB {
  final int id;
  final int companyId;
  final String name;
  final DateTime? startDate;
  final Duration? timeEmployed;

  EmployeeB({
    required this.id,
    required this.companyId,
    required this.name,
    this.startDate,
    this.timeEmployed,
  });

  [@override](/user/override)
  String toString() {
    return 'EmployeeB{id: $id, companyId: $companyId, name: $name, startDate: $startDate, timeEmployed: $timeEmployed}';
  }
}

void main() {
  var now = DateTime.now();
  var mapper = Mapper()
      .addMap<CompanyB, CompanyA>(
        (source, mapper, [params]) => CompanyB(
          id: source.id,
          name: source.name,

          // 使用映射器映射子对象
          employees: source.employees
              ?.map(
                (employee) => mapper.map<EmployeeB, EmployeeA>(employee, {
                  'companyId': source.id,
                }),
              )
              .toList(),
        ),
      )
      .addMap<EmployeeB, EmployeeA>(
        (source, mapper, [params]) => EmployeeB(
          id: source.id,

          // EmployeeA 没有 companyId,因此通过 params 传递
          companyId: params!['companyId'] ?? 0,
          name: source.name,
          startDate: source.startDate,
          timeEmployed: source.startDate == null || source.endDate == null
              ? null
              : source.endDate!.difference(source.startDate!),
        ),
      );

  var companyA = CompanyA(
    id: 1,
    name: 'ABC',
    employees: <EmployeeA>[
      EmployeeA(
        id: 1,
        name: 'John Smith',
        startDate: now.subtract(Duration(days: 30)),
        endDate: now,
      )
    ],
  );

  print('原始对象:');
  print(companyA);
  print('映射后:');
  print(mapper.map<CompanyB, CompanyA>(companyA));
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter数据映射插件simple_mapper的代码案例。这个插件允许你将JSON数据映射到Dart对象,反之亦然。假设你有一个简单的用户模型,我们将展示如何使用simple_mapper进行JSON与Dart对象之间的转换。

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

dependencies:
  flutter:
    sdk: flutter
  simple_mapper: ^最新版本号  # 请替换为当前最新版本号

然后运行flutter pub get来获取依赖。

接下来,我们定义一个简单的用户模型,并使用simple_mapper的注解来指定字段映射:

import 'package:simple_mapper/simple_mapper.dart';

@DataClass()
class User {
  @JsonProperty(name: 'user_id')
  final int id;

  @JsonProperty(name: 'full_name')
  final String name;

  @JsonProperty(name: 'email_address')
  final String email;

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

  // 为了简单起见,这里不提供fromJson和toJson方法,因为@DataClass注解会自动生成它们
}

注意,@JsonProperty注解允许我们指定JSON字段名与Dart属性名之间的映射关系。

现在,我们来看一下如何使用simple_mapper将这个模型与JSON数据进行转换:

import 'package:flutter/material.dart';
import 'package:simple_mapper/simple_mapper.dart';
import 'user_model.dart';  // 假设上面的User类定义在这个文件中

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Simple Mapper Example'),
        ),
        body: Center(
          child: SimpleMapperExample(),
        ),
      ),
    );
  }
}

class SimpleMapperExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例JSON数据
    String jsonData = '''
    {
      "user_id": 1,
      "full_name": "John Doe",
      "email_address": "john.doe@example.com"
    }
    ''';

    // 将JSON数据转换为User对象
    User user = UserMapper().fromJson(jsonData);

    // 将User对象转换回JSON数据
    String userJson = UserMapper().toJson(user);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('User ID: ${user.id}'),
        Text('Name: ${user.name}'),
        Text('Email: ${user.email}'),
        SizedBox(height: 20),
        Text('JSON Representation:\n$userJson'),
      ],
    );
  }
}

// 注意:simple_mapper在后台生成Mapper类,默认情况下类名会是Model类名+Mapper后缀
// 例如,User类的Mapper类会自动命名为UserMapper

在上面的代码中,我们定义了一个简单的Flutter应用,其中包含一个SimpleMapperExample小部件。这个部件演示了如何使用simple_mapper将JSON字符串转换为User对象,然后再将User对象转换回JSON字符串。

请注意,simple_mapper在后台生成Mapper类(例如,UserMapper),这些类负责处理实际的转换逻辑。你不需要手动编写这些Mapper类,只需要确保你的模型类使用了正确的注解。

此外,如果你使用的是较新版本的simple_mapper,或者库的API有所变化,请参考官方文档以获取最新的使用指南和API参考。

回到顶部