Flutter数据序列化与反序列化插件hive_built_value_generator的使用

Flutter数据序列化与反序列化插件hive_built_value_generator的使用

在Flutter开发中,我们经常需要处理数据的序列化和反序列化。hive_built_value_generator 是一个强大的工具,可以帮助我们轻松实现这一过程。本文将通过一个完整的示例演示如何使用 hive_built_value_generator 插件。

安装依赖

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

dependencies:
  flutter:
    sdk: flutter
  hive: ^2.0.4
  built_value: ^8.0.0
  hive_flutter: ^1.1.0
  hive_built_value_generator: ^0.9.0
  build_runner: ^2.0.0

然后运行 flutter pub get 来安装这些依赖。

创建数据模型

接下来,我们需要创建一个数据模型类,并使用 @HiveType@HiveField 注解来定义其属性。同时,我们还需要实现 Built 接口。

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

// 部分生成器文件
part 'person.g.dart';

// 定义Person类
@HiveType(typeId: 0)
abstract class Person implements Built<Person, PersonBuilder> {
  // 构造函数
  factory Person([void Function(PersonBuilder) updates]) = _$Person;
  Person._();

  // 属性
  @HiveField(0)
  String name;

  @HiveField(1)
  int age;

  @HiveField(2)
  BuiltMap<String, Pet>? get pets;

  @HiveField(3)
  @BuiltValueField(wireName: 'alternative_name')
  String? get aka;

  // 序列化方法
  Map<String, dynamic> toJson() {
    return serializers.serializeWith(Person.serializer, this);
  }

  // 反序列化方法
  static Person fromJson(Map<String, dynamic> json) {
    return serializers.deserializeWith(Person.serializer, json);
  }

  // 序列化器
  static Serializer<Person> get serializer => _$personSerializer;
}

// 定义Pet类
@HiveType(typeId: 1)
abstract class Pet implements Built<Pet, PetBuilder> {
  // 构造函数
  factory Pet([void Function(PetBuilder) updates]) = _$Pet;
  Pet._();

  // 属性
  @HiveField(0)
  String name;

  @HiveField(1)
  String species;
  
  // 序列化方法
  Map<String, dynamic> toJson() {
    return serializers.serializeWith(Pet.serializer, this);
  }

  // 反序列化方法
  static Pet fromJson(Map<String, dynamic> json) {
    return serializers.deserializeWith(Pet.serializer, json);
  }

  // 序列化器
  static Serializer<Pet> get serializer => _$petSerializer;
}

生成代码

为了生成必要的代码,我们需要运行构建命令:

flutter pub run build_runner build

这将会生成 person.g.dartpet.g.dart 文件,这些文件包含了序列化和反序列化的逻辑。

使用数据模型

现在我们可以开始使用我们的数据模型了。首先,打开数据库并存储数据,然后读取数据并进行反序列化。

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'person.dart'; // 引入数据模型

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  Hive.registerAdapter(PersonAdapter());
  Hive.registerAdapter(PetAdapter());

  var box = await Hive.openBox('myBox');

  // 存储数据
  var person = Person((b) => b
    ..name = 'Alice'
    ..age = 30
    ..pets = BuiltMap.of({'dog': Pet((b) => b..name = 'Rex'..species = 'Dog')})
    ..aka = 'Wonder Woman');
  box.put('person', person);

  // 读取数据
  var personFromBox = box.get('person');
  print(personFromBox.name); // 输出 "Alice"
  print(personFromBox.age); // 输出 30
  print(personFromBox.pets); // 输出 {"dog": Instance of 'Pet'}
  print(personFromBox.aka); // 输出 "Wonder Woman"
}

class PersonAdapter extends TypeAdapter<Person> {
  [@override](/user/override)
  final int typeId = 0;

  [@override](/user/override)
  Person read(BinaryReader reader) {
    return Person.fromJson(reader.readMap());
  }

  [@override](/user/override)
  void write(BinaryWriter writer, Person obj) {
    writer.writeMap(obj.toJson());
  }
}

class PetAdapter extends TypeAdapter<Pet> {
  [@override](/user/override)
  final int typeId = 1;

  [@override](/user/override)
  Pet read(BinaryReader reader) {
    return Pet.fromJson(reader.readMap());
  }

  [@override](/user/override)
  void write(BinaryWriter writer, Pet obj) {
    writer.writeMap(obj.toJson());
  }
}

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

1 回复

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


hive_built_value_generator 是一个用于 Flutter 和 Dart 的代码生成器插件,它与 hivebuilt_value 一起使用,帮助开发者更轻松地进行数据序列化和反序列化。通过使用 hive_built_value_generator,你可以自动生成 built_value 模型的代码,从而减少手写代码的工作量。

1. 安装依赖

首先,你需要在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.4.0
  hive: ^2.0.0
  hive_flutter: ^1.1.0

dev_dependencies:
  build_runner: ^2.1.0
  hive_generator: ^1.1.0
  built_value_generator: ^8.4.0

2. 创建数据模型

接下来,你可以创建一个数据模型类,并使用 @HiveType@HiveField 注解来标记字段。例如:

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

part 'user_model.g.dart';

@HiveType(typeId: 1)
abstract class UserModel implements Built<UserModel, UserModelBuilder> {
  @HiveField(0)
  String get name;

  @HiveField(1)
  int get age;

  UserModel._();
  factory UserModel([void Function(UserModelBuilder) updates]) = _$UserModel;

  static Serializer<UserModel> get serializer => _$userModelSerializer;
}

3. 生成代码

运行以下命令来生成代码:

flutter pub run build_runner build

这将生成 user_model.g.dart 文件,其中包含 UserModel 的序列化和反序列化代码。

4. 使用 Hive 进行数据存储

现在你可以使用 Hive 来存储和读取数据。首先,初始化 Hive 并注册适配器:

import 'package:hive_flutter/hive_flutter.dart';
import 'user_model.dart';

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(UserModelAdapter());

  await Hive.openBox('userBox');

  var box = Hive.box('userBox');

  var user = UserModel((b) => b
    ..name = 'John Doe'
    ..age = 30);

  box.put('user', user);

  var savedUser = box.get('user') as UserModel;
  print('Name: ${savedUser.name}, Age: ${savedUser.age}');
}

5. 使用 built_value 进行序列化

built_value 还提供了序列化和反序列化的功能,你可以使用它来处理 JSON 或其他格式的数据。

import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'user_model.dart';

void main() {
  var user = UserModel((b) => b
    ..name = 'Jane Doe'
    ..age = 25);

  var serializers = (Serializers().toBuilder()..addPlugin(StandardJsonPlugin())).build();

  var json = serializers.serialize(user);
  print(json);

  var deserializedUser = serializers.deserializeWith(UserModel.serializer, json);
  print('Deserialized: Name: ${deserializedUser.name}, Age: ${deserializedUser.age}');
}
回到顶部