Flutter数据序列化插件built_value的使用

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

Flutter数据序列化插件built_value的使用

简介

built_value 是一个用于 Dart 的库,它提供了不可变值类型、枚举类和 JSON 序列化等功能。它帮助开发者创建不可变的数据模型,并且能够自动生成大量的样板代码(boilerplate code),从而减少手动编写和维护的成本。此外,它还支持复杂的对象模型设计,包括泛型和接口的使用。

安装与配置

pubspec.yaml 文件中添加依赖项:

dependencies:
  built_value: ^8.6.0 # 请根据最新版本进行调整
  built_collection: ^5.1.1 # 用于处理不可变集合

dev_dependencies:
  build_runner: ^2.3.3 # 用于生成代码
  built_value_generator: ^8.6.0 # 用于生成代码

确保你已经安装了 build_runnerbuilt_value_generator,它们是用于生成代码的工具。

示例代码

下面是一个完整的示例,展示了如何使用 built_value 创建一个简单的 Person 类,并实现其 JSON 序列化和反序列化功能。

定义 Person 类

首先,在 lib/models/person.dart 文件中定义 Person 类:

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:built_collection/built_collection.dart';

part 'person.g.dart'; // 自动生成的代码将放在这里

abstract class Person implements Built<Person, PersonBuilder> {
  // 静态方法返回序列化器
  static Serializer<Person> get serializer => _$personSerializer;

  // 必填字段
  int get id;

  // 可选字段
  @nullable
  int get age;

  // 使用 @BuiltValueField 注解映射 JSON 字段名
  @nullable
  @BuiltValueField(wireName: 'first_name')
  String get firstName;

  // 可选字段,使用 BuiltList 表示不可变列表
  @nullable
  BuiltList<String> get hobbies;

  // 私有构造函数
  Person._();

  // 工厂构造函数,用于创建新实例或更新现有实例
  factory Person([void Function(PersonBuilder) updates]) = _$Person;
}

生成代码

在项目根目录下运行以下命令以生成代码:

flutter pub run build_runner build

这将为 Person 类生成必要的代码,并保存在 person.g.dart 文件中。

使用 Person 类

接下来,我们可以在应用程序中使用 Person 类来进行序列化和反序列化操作。

创建和序列化 Person 对象

import 'package:built_value/json_serializable.dart';
import 'models/person.dart';
import 'serializers.dart'; // 包含所有序列化器的文件

void main() {
  final person = Person((b) => b
    ..id = 12345
    ..age = 35
    ..firstName = "Jimmy"
    ..hobbies.replace(BuiltList<String>(["jumping", "basketball"]))
  );

  // 将 Person 对象转换为 JSON 字符串
  final jsonString = jsonEncode(person, serializers: serializers);
  print(jsonString);
}

反序列化 JSON 字符串为 Person 对象

import 'dart:convert';
import 'models/person.dart';
import 'serializers.dart'; // 包含所有序列化器的文件

void main() {
  final jsonString = '{"id":12345,"age":35,"first_name":"Jimmy","hobbies":["jumping","basketball"]}';

  // 将 JSON 字符串转换为 Person 对象
  final dynamicMap = jsonDecode(jsonString);
  final person = serializers.deserializeWith(Person.serializer, dynamicMap);
  print(person);
}

定义序列化器

为了使上述代码正常工作,还需要定义一个包含所有序列化器的文件 serializers.dart

import 'package:built_value/serializer.dart';
import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';
import 'models/person.dart';

part 'serializers.g.dart';

@SerializersFor(const [
  Person,
  // 如果有其他需要序列化的类也添加到这里
])
final Serializers serializers = _$serializers;

然后再次运行 flutter pub run build_runner build 来生成 serializers.g.dart 文件。

总结

通过以上步骤,我们可以轻松地使用 built_value 插件来创建不可变的数据模型,并实现这些模型与 JSON 数据之间的相互转换。这对于构建高效且易于维护的应用程序非常有用。希望这个指南对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用built_value插件进行数据序列化的代码案例。built_value是一个强大的库,用于在Dart中创建不可变且可比较的值类型(通常是数据模型)。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加built_value及其相关依赖:

dependencies:
  flutter:
    sdk: flutter
  built_value: ^9.1.0  # 请检查最新版本
  built_collection: ^5.1.0  # 通常与built_value一起使用

dev_dependencies:
  build_runner: ^2.1.4  # 用于生成代码
  built_value_generator: ^9.1.0  # 生成built_value相关代码

2. 创建数据模型

接下来,创建一个数据模型。例如,我们有一个User类,包含nameage字段。

import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';

part 'user.g.dart';

abstract class User implements Built<User, UserBuilder> {
  String get name;
  int get age;

  // 如果需要,可以添加其他方法和字段

  User._();

  factory User([updates(UserBuilder b)]) = _$User;
}

3. 生成代码

在项目根目录下运行以下命令以生成built_value所需的代码:

flutter pub run build_runner build

这将在user.g.dart文件中生成必要的实现代码。

4. 使用数据模型

现在,你可以使用User类来创建和操作不可变的数据对象。

void main() {
  // 创建一个User实例
  User user = User((b) => b
    ..name = 'Alice'
    ..age = 30
  );

  // 访问字段
  print('Name: ${user.name}');
  print('Age: ${user.age}');

  // 创建另一个User实例,用于比较
  User anotherUser = User((b) => b
    ..name = 'Alice'
    ..age = 30
  );

  // 比较两个User实例
  print('Are users equal? ${user == anotherUser}');  // 输出: true

  // 尝试修改User实例(不可变,会创建一个新的实例)
  User updatedUser = user.rebuild((b) => b.age = 31);
  print('Updated Age: ${updatedUser.age}');  // 输出: 31
  print('Original Age: ${user.age}');  // 输出: 30
}

5. 序列化与反序列化

built_value本身不直接支持JSON序列化,但你可以结合json_serializable来实现这一点。首先,添加json_serializable的依赖:

dependencies:
  json_annotation: ^4.0.1  # 请检查最新版本

dev_dependencies:
  json_serializable: ^6.1.3  # 请检查最新版本

然后,在你的数据模型中添加JSON序列化支持:

import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
abstract class User implements Built<User, UserBuilder> {
  String get name;
  int get age;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);

  User._();

  factory User([updates(UserBuilder b)]) = _$User;
}

再次运行代码生成命令:

flutter pub run build_runner build

现在,你可以轻松地将User对象序列化为JSON字符串,或从JSON字符串反序列化回User对象:

void main() {
  // 创建一个User实例
  User user = User((b) => b
    ..name = 'Alice'
    ..age = 30
  );

  // 序列化为JSON
  String jsonString = user.toJson().toString();
  print('JSON: $jsonString');

  // 反序列化为User对象
  User deserializedUser = User.fromJson(jsonDecode(jsonString));
  print('Deserialized Name: ${deserializedUser.name}');
  print('Deserialized Age: ${deserializedUser.age}');
}

这就是在Flutter项目中使用built_value进行数据序列化的基本方法。希望这能帮助你更好地理解和应用这个强大的库!

回到顶部