Flutter数据转换插件super_converter的使用
Flutter数据转换插件super_converter的使用
功能特性
- 任意类型之间的转换:可以将任何类型的数据转换为另一种类型,只要提供了必要的转换规则。
- 基本类型自动转换:Dart的基本类型(如
int
、String
、bool
等)可以直接进行转换。 - 自定义类的支持:可以通过
FromMapConverter
轻松地将自定义类添加到可转换类型中。 - 枚举支持:枚举类型也支持自动转换。
- 从Map中提取特定键并转换:可以从Map中提取特定的键,并将其转换为指定类型。
- 支持嵌套键:可以从嵌套的Map中提取数据并进行转换。
- 更多功能:还提供了其他实用的功能。
开始使用
-
添加依赖 在
pubspec.yaml
文件中添加super_converter
依赖:dependencies: super_converter: ^latest_version
-
注册自定义类 在应用启动时,注册你需要转换的类和枚举:
import 'package:super_converter/super_converter.dart'; // 注册枚举转换器 SuperConverter.registerConverters([ EnumConverter<Gender>(Gender.values), ]); // 注册自定义类转换器 SuperConverter.registerConverters([ FromMapConverter<UserDto>(UserDto.fromMap), ]);
-
进行转换 你可以直接调用
convert()
方法来进行数据转换:UserDto user = apiResponse.convert(); // 将apiResponse转换为UserDto UserDto? userNullable = apiResponse.convert(); // 可为空的UserDto final userExplicitly = apiResponse.convert<UserDto?>(); // 显式指定类型的转换
使用示例
1. 简单类型转换
整数转换
int intValue = '5'.convert(); // 将字符串'5'转换为整数5
int intValue2 = 5.convert(); // 直接转换整数5
int intValue3 = ' 5 '.convert(); // 去除空格后转换为整数5
日期转换
默认支持的日期格式:
'MM/dd/yyyy HH:mm'
'MM/dd/yyyy hh:mm a'
'MM/dd/yyyy'
'yyyy-MM-dd hh:mm a'
'yyyy-MM-dd HH:mm'
'yyyy-MM-dd'
如果需要注册自定义日期格式:
SuperConverter.registerDateFormats(['yyyy-MM-dd']);
使用示例:
DateTime date = '2020-11-24'.convert(); // 将字符串'2020-11-24'转换为DateTime对象
DateTime date2 = DateTime.now().toUtc().convert(); // 将当前时间转换为UTC时间
枚举转换
定义一个枚举:
enum Gender { male, female, otherwise }
在main.dart
中注册枚举转换器:
SuperConverter.registerConverters([EnumConverter<Gender>(Gender.values)]);
使用示例:
Gender gender = 'male'.convert(); // 将字符串'male'转换为Gender.male
Gender gender2 = 'female'.convert(); // 将字符串'female'转换为Gender.female
Gender gender3 = 'OTHERWISE'.convert(); // 将字符串'OTHERWISE'转换为Gender.otherwise
Gender? genderInvalid = 'c'.convert(); // 无效的字符串转换为null
2. 自定义类转换
注册自定义类
SuperConverter.registerConverters([FromMapConverter<UserDto>(UserDto.fromMap)]);
使用示例
假设API返回的JSON字符串如下:
{
"id": 1,
"profile": {
"name": "ismael",
"gender": "male"
},
"email": "ismael@gmail.com"
}
定义一个UserDto
类:
class UserDto {
final int id;
final String name;
final String email;
final Gender gender;
UserDto({
required this.id,
required this.name,
required this.email,
required this.gender,
});
factory UserDto.fromMap(Map<String, dynamic> map) {
return UserDto(
id: map.from('id'),
name: map.from('profile.name'), // 支持嵌套键
gender: map.from('profile.gender'), // 支持枚举转换
email: map.from('email'),
);
}
}
进行转换:
String apiResponse = '{"id":1,"profile":{"name":"ismael","gender":"male"},"email":"ismael@gmail.com"}';
UserDto user = apiResponse.convert(); // 将JSON字符串转换为UserDto对象
3. Map工具
super_converter
还提供了一些Map操作的工具方法,例如从Map中提取嵌套的键值并进行转换:
class UserDto {
final int id;
final String name;
final String email;
final Gender gender;
UserDto({
required this.id,
required this.name,
required this.email,
required this.gender,
});
factory UserDto.fromMap(Map<String, dynamic> map) {
return UserDto(
id: map.from('id'), // 从Map中提取'id'键的值
name: map.from('profile.name'), // 从嵌套的Map中提取'profile.name'键的值
gender: map.from('profile.gender'), // 从嵌套的Map中提取'profile.gender'键的值并转换为Gender枚举
email: map.from('email'), // 从Map中提取'email'键的值
);
}
}
额外信息
所有的代码示例都可以在示例项目中找到。你可以参考示例项目来更好地理解如何使用super_converter
插件。
完整示例Demo
以下是一个完整的Flutter项目示例,展示了如何使用super_converter
插件进行数据转换。
1. pubspec.yaml
文件
name: super_converter_demo
description: A demo project for using super_converter package.
publish_to: 'none' # Remove this line if you wish to publish the package
version: 1.0.0+1
environment:
sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
super_converter: ^latest_version
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
2. main.dart
文件
import 'package:flutter/material.dart';
import 'package:super_converter/super_converter.dart';
void main() {
// 注册枚举和自定义类的转换器
SuperConverter.registerConverters([
EnumConverter<Gender>(Gender.values),
FromMapConverter<UserDto>(UserDto.fromMap),
]);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Super Converter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
UserDto? _user;
void _fetchData() {
// 模拟API响应
String apiResponse = '{"id":1,"profile":{"name":"Ismael","gender":"male"},"email":"ismael@gmail.com"}';
// 将JSON字符串转换为UserDto对象
UserDto user = apiResponse.convert();
setState(() {
_user = user;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Super Converter Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _fetchData,
child: Text('Fetch Data'),
),
if (_user != null)
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text('ID: ${_user!.id}'),
Text('Name: ${_user!.name}'),
Text('Gender: ${_user!.gender}'),
Text('Email: ${_user!.email}'),
],
),
),
],
),
),
);
}
}
// 定义Gender枚举
enum Gender { male, female, otherwise }
// 定义UserDto类
class UserDto {
final int id;
final String name;
final String email;
final Gender gender;
UserDto({
required this.id,
required this.name,
required this.email,
required this.gender,
});
factory UserDto.fromMap(Map<String, dynamic> map) {
return UserDto(
id: map.from('id'),
name: map.from('profile.name'),
gender: map.from('profile.gender'),
email: map.from('email'),
);
}
}
更多关于Flutter数据转换插件super_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据转换插件super_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用super_converter
插件进行数据转换的代码示例。super_converter
是一个用于在Flutter应用中方便地进行数据序列化和反序列化的插件。
首先,确保你已经在pubspec.yaml
文件中添加了super_converter
依赖:
dependencies:
flutter:
sdk: flutter
super_converter: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,我们创建一个简单的数据模型,并使用super_converter
进行序列化和反序列化。
1. 创建数据模型
假设我们有一个用户模型User
:
import 'package:super_converter/super_converter.dart';
@JsonSerializable()
class User {
final String name;
final int age;
User({required this.name, required this.age});
// 用于从JSON生成User对象
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
// 用于将User对象转换为JSON
Map<String, dynamic> toJson() => _$UserToJson(this);
}
注意:@JsonSerializable()
注解告诉super_converter
生成相应的fromJson
和toJson
方法。
2. 生成序列化代码
在命令行中运行以下命令以生成序列化代码:
flutter pub run build_runner build
这将生成User
类的_$UserFromJson
和_$UserToJson
方法。
3. 使用super_converter
进行序列化和反序列化
现在,我们可以在应用中使用这些方法进行数据转换:
import 'package:flutter/material.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('Super Converter Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('User Serialization and Deserialization'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 创建一个User对象
User user = User(name: 'Alice', age: 30);
// 将User对象转换为JSON
Map<String, dynamic> userJson = user.toJson();
print('User JSON: $userJson');
// 将JSON转换回User对象
User deserializedUser = User.fromJson(userJson);
print('Deserialized User: ${deserializedUser.name}, ${deserializedUser.age}');
},
child: Text('Convert'),
),
],
),
),
),
);
}
}
总结
以上代码展示了如何在Flutter项目中使用super_converter
插件进行数据转换。首先,我们定义了一个数据模型User
,并使用@JsonSerializable()
注解。然后,我们使用flutter pub run build_runner build
命令生成序列化代码。最后,我们在应用中使用toJson
和fromJson
方法进行数据的序列化和反序列化。
请确保你已经正确设置了构建脚本和依赖,以便build_runner
可以正常运行。如果你遇到任何问题,可以查看super_converter
的官方文档以获取更多信息和示例。