Flutter枚举序列化插件serialize_enum的使用

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

Flutter枚举序列化插件serialize_enum的使用

在Dart和Flutter中持久化对象通常涉及将对象转换为Map<String, dynamic>(使用名为toJson()的方法),然后将该映射转换为字符串(使用jsonEncode函数),最后将生成的字符串存储到文件或数据库中。要恢复对象时,从存储的字符串中读取,将其转换回Map<String, dynamic>(使用jsonDecode函数),并使用通常命名为.fromJson的工厂构造函数创建原始对象的一个副本。

动机

为大量数据类编写toJson()方法和工厂构造函数fromJson()可能既繁琐又容易出错,通常通过注解数据类并使用像json_serializable这样的包来生成源代码来完成这项任务。然而,对于小型项目来说,源代码生成可能会增加不必要的复杂性。Dart枚举通常表示需要在退出应用程序后持久化的设置或选项。插件serialize_enum提供了混入(mixins)以在不生成源代码的情况下序列化Dart枚举。所有需要做的就是在声明枚举时添加with语句,并定义一个调用由混入提供的静态方法的工厂构造函数。

使用

pubspec.yaml文件中将serialize_enum作为dev_dependency包含进来。

以下示例展示了枚举AlphabeticOrder。泛型混入SerializeByName提供了toJson方法。枚举的工厂构造函数调用了由混入提供的静态方法fromJson

import 'package:serialize_enum/serialize_enum.dart';

// 定义一个带有SerializeByName混入的枚举
enum AlphabeticOrder with SerializeByName<AlphabeticOrder> {
  asc,
  desc;

  // 从json映射读取并返回对应的AlphabeticOrder实例
  factory AlphabeticOrder.fromJson(Map<String, dynamic> json) =>
      SerializeByName.fromJson(json: json, values: values);
}

注意:SerializeByName的泛型类型参数必须指定。它用于生成json映射中的key,该key下存储的是枚举的name

void main() {
  const order = AlphabeticOrder.asc;

  print('Json map:');
  print(order.toJson());

  print('\nRevived enum:');
  print(AlphabeticOrder.fromJson(order.toJson()));
}

运行程序会产生以下控制台输出:

$ dart alphabetic_order_example.dart
Json map:
{alphabeticOrder: asc}

Revived enum:
AlphabeticOrder.asc

进一步的序列化选项

如果希望在序列化枚举实例时存储其index而不是name,可以使用混入SerializeByIndex

为了在序列化枚举时使用自定义键,可以实现SerializeByIndexSerializeByName

import 'package:serialize_enum/serialize_enum.dart';

enum AlphabeticOrder implements SerializableByName {
  asc,
  desc;

  // 自定义键用于序列化枚举
  static const key = 'customKey';

  [@override](/user/override)
  Map<String, dynamic> toJson() => {key: name};

  // 返回自定义键下的枚举实例
  factory AlphabeticOrder.fromJson(Map<String, dynamic> json) =>
      SerializableByNameCustomKey.fromJson(
        json: json,
        values: values,
        key: key,
      );
}

更多关于Flutter枚举序列化插件serialize_enum的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter枚举序列化插件serialize_enum的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 serialize_enum 插件在 Flutter 中进行枚举序列化的代码示例。serialize_enum 插件允许你将枚举值转换为字符串,以及从字符串解析回枚举值,这在 JSON 序列化和反序列化时非常有用。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 serialize_enum 依赖:

dependencies:
  flutter:
    sdk: flutter
  serialize_enum: ^2.0.0  # 请检查最新版本号

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

2. 定义枚举并使用 @SerializeEnum 注解

接下来,定义一个枚举并使用 @SerializeEnum 注解。这个注解会告诉 serialize_enum 如何将枚举值序列化为字符串。

import 'package:serialize_enum/serialize_enum.dart';

part 'color_enum.g.dart';

@SerializeEnum()
enum Color {
  @EnumValue('RED')
  red,
  @EnumValue('GREEN')
  green,
  @EnumValue('BLUE')
  blue,
}

3. 生成序列化代码

由于 serialize_enum 使用代码生成,你需要运行构建脚本以生成序列化代码。在命令行中运行以下命令:

flutter pub run build_runner build

这将在你的项目目录中生成一个 color_enum.g.dart 文件,包含序列化逻辑。

4. 使用生成的序列化功能

现在,你可以使用生成的序列化功能将枚举值转换为字符串,以及从字符串解析回枚举值。

void main() {
  // 序列化枚举值
  String redSerialized = Color.red.toJson();
  print('Serialized RED: $redSerialized');  // 输出: Serialized RED: RED

  // 反序列化字符串为枚举值
  Color colorFromJson = ColorExtension.fromJson('GREEN');
  print('Deserialized color: ${colorFromJson}');  // 输出: Deserialized color: Color.green
}

5. 在 Flutter 应用中使用

假设你有一个包含枚举字段的数据模型,并希望将其序列化为 JSON 以及从 JSON 反序列化。

import 'dart:convert';

class Item {
  final Color color;
  final String name;

  Item({required this.color, required this.name});

  // 将对象转换为 JSON
  Map<String, dynamic> toJson() {
    return {
      'color': color.toJson(),
      'name': name,
    };
  }

  // 从 JSON 创建对象
  factory Item.fromJson(Map<String, dynamic> json) {
    return Item(
      color: ColorExtension.fromJson(json['color'] as String),
      name: json['name'] as String,
    );
  }

  // 为了方便,重写 toString 方法
  @override
  String toString() {
    return jsonEncode(this.toJson());
  }
}

void main() {
  // 创建一个 Item 对象
  Item item = Item(color: Color.red, name: 'Apple');

  // 序列化 Item 对象为 JSON
  String jsonString = item.toString();
  print('Serialized Item: $jsonString');  // 输出: Serialized Item: {"color":"RED","name":"Apple"}

  // 反序列化 JSON 为 Item 对象
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  Item deserializedItem = Item.fromJson(jsonMap);
  print('Deserialized Item: $deserializedItem');  // 输出: Deserialized Item: {"color":"RED","name":"Apple"}
}

总结

通过上述步骤,你可以在 Flutter 项目中使用 serialize_enum 插件来轻松实现枚举的序列化和反序列化。这对于需要在 JSON 数据中传输枚举值的场景非常有用。

回到顶部