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
更多关于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参考。