先决条件:
MacOS | VSCode | Flutter | Dart |
---|---|---|---|
13.1 | 1.76.2 | 3.3.10 | 2.18.6 |
上一篇讲了使用Hive
存储基础类型
数据
这篇我轻度封装一下对象类型
的存储
1. 插件引入
//1 注意这里不变, 仍然是需要这两个依赖
dependencies:
flutter:
sdk: flutter
hive: ^2.2.3 #数据持久化
hive_flutter: ^1.1.0 # hive插件扩展
//2 注意在这里添加两个依赖
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.3.3 #编译
hive_generator: ^2.0.0 #用于生成对象存储适配器文件
终端cd到项目文件目录下执行 flutter pub get
命令, 安装第三方插件, 这个不用多说了
2. 模型怎么写, 哈哈哈, 按照以下代码写, 注意: 这些必须手写
import 'package:hive/hive.dart';
@HiveType(typeId: 0) // typeId 范围是0-233, 每个模型类的typeId应不同
class CourseModel extends HiveObject {
// 课程编号
@HiveField(0) // 声明courseId 是支持Hive的文件, 模型中的每个变量的HiveFiled 编号应不同
int courseId = 0;
// 课程名称
@HiveField(1)
String courseName = '';
// 课程背景图片
@HiveField(2)
String courseCover = '';
// 课程内容链接
@HiveField(3)
String courseContentUrl = '';
// 必须的构造方法
CourseModel(
this.courseId,
this.courseName,
this.courseCover,
this.courseContentUrl,
);
}
3. 生成part XxxxModel.g.dart即适配器(XxxxModelAdapter.dart)文件
- 终端cd到项目目录下, 执行
注意: 执行之前一定要先保存 Command + s, 一定要保存
flutter packages pub run build_runner build
- 执行完成之后会有一个警告, 而且你会发现并没有自动生成任何相关文件
[WARNING] source_gen:combining_builder on lib/pages/PublicModel/CourseModel.dart:
CourseModel.g.dart must be included as a part directive in the input library with:
part 'CourseModel.g.dart';
- 复制警告结尾的
part 'CourseModel.g.dart';
- 粘贴到如下代码 . 注意此时会报错, 显示红色波浪线, 不用关心, 继续看下一步
import 'package:hive/hive.dart';
// 粘贴到这里, 注意不能在import xxx; 上边, 会报错
part 'CourseModel.g.dart';
@HiveType(typeId: 0) // typeId 范围是0-233, 每个模型类的typeId应不同
class CourseModel extends HiveObject {...}
- 再次执行
注意: 执行之前一定要先保存 Command + s, 一定要保存
flutter packages pub run build_runner build
这时你就会发现文件目录中多出来一个文件
CourseModel.g.dart
点进去看这个类的声明, 你就会发现
CourseModelAdapter
适配器类
4. 注册适配器
想要存储这个类, 需要注册这个HiveObject对象的适配器
在程序入口注册, 如下:
import 'package:hive_flutter/hive_flutter.dart';
// 项目基础异步初始化
Future setup() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Hive
await Hive.initFlutter();
// 注意, 注册适配器不可以是```await```, 不信你试试, 注册函数的参数是适配器的实例化对象
Hive.registerAdapter(CourseModelAdapter());
}
// 修改为如下样子
// 调用 await setup()
void main() async {
await setup();
runApp(const MyApp());
}
5. 封装可全局调用的单例对象
核心思路, 充分使用 setter
和getter
方法, 来便捷读写
import 'package:hive/hive.dart';
import 'package:test_demo/pages/PublicModel/CourseModel.dart';
class Database {
static final Database shared = Database();
// 这个盒子需要先打开, 合适的位置是 程序入口
final box = Hive.box(objectHiveName);
// App配置信息
CourseModel get courseModel => box.get("CourseModel");
set courseModel(CourseModel value) => box.put("CourseModel", value);
}
- 打开盒子的代码写在程序入口
import 'package:hive_flutter/hive_flutter.dart';
// 对象存储盒子的名称
final objectHiveName = 'objectHiveName';
// 项目基础异步初始化
Future setup() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Hive
await Hive.initFlutter();
// 打开对象存储盒子
await Hive.openBox(objectHiveName);
// 注意, 注册适配器不可以是```await```, 不信你试试, 注册函数的参数是适配器的实例化对象
Hive.registerAdapter(CourseModelAdapter());
}
// 调用 await setup()
void main() async {
await setup();
runApp(const MyApp());
}
6. 使用示例
testdemo() {
var course = CourseModel(
111,
'Hive对象存储',
'http://xxxx.ccc',
'http://xxxx.ccc',
);
// 存入
Database.shared.courseModel = course;
// 获取:
var model = Database.shared.courseModel;
}