Flutter数据转换插件super_converter的使用

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

Flutter数据转换插件super_converter的使用

功能特性

  • 任意类型之间的转换:可以将任何类型的数据转换为另一种类型,只要提供了必要的转换规则。
  • 基本类型自动转换:Dart的基本类型(如intStringbool等)可以直接进行转换。
  • 自定义类的支持:可以通过FromMapConverter轻松地将自定义类添加到可转换类型中。
  • 枚举支持:枚举类型也支持自动转换。
  • 从Map中提取特定键并转换:可以从Map中提取特定的键,并将其转换为指定类型。
  • 支持嵌套键:可以从嵌套的Map中提取数据并进行转换。
  • 更多功能:还提供了其他实用的功能。

开始使用

  1. 添加依赖pubspec.yaml文件中添加super_converter依赖:

    dependencies:
      super_converter: ^latest_version
    
  2. 注册自定义类 在应用启动时,注册你需要转换的类和枚举:

    import 'package:super_converter/super_converter.dart';
    
    // 注册枚举转换器
    SuperConverter.registerConverters([
      EnumConverter<Gender>(Gender.values),
    ]);
    
    // 注册自定义类转换器
    SuperConverter.registerConverters([
      FromMapConverter<UserDto>(UserDto.fromMap),
    ]);
    
  3. 进行转换 你可以直接调用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

1 回复

更多关于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生成相应的fromJsontoJson方法。

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命令生成序列化代码。最后,我们在应用中使用toJsonfromJson方法进行数据的序列化和反序列化。

请确保你已经正确设置了构建脚本和依赖,以便build_runner可以正常运行。如果你遇到任何问题,可以查看super_converter的官方文档以获取更多信息和示例。

回到顶部