先決條件:
| MacOS | VSCode | Flutter | Dart |
|---|---|---|---|
| 13.1 | 1.76.2 | 3.3.10 | 2.18.6 |
上一篇講了使用Hive存儲(chǔ)基礎(chǔ)類型數(shù)據(jù)
這篇我輕度封裝一下對(duì)象類型的存儲(chǔ)
1. 插件引入
//1 注意這里不變, 仍然是需要這兩個(gè)依賴
dependencies:
flutter:
sdk: flutter
hive: ^2.2.3 #數(shù)據(jù)持久化
hive_flutter: ^1.1.0 # hive插件擴(kuò)展
//2 注意在這里添加兩個(gè)依賴
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.3.3 #編譯
hive_generator: ^2.0.0 #用于生成對(duì)象存儲(chǔ)適配器文件
終端cd到項(xiàng)目文件目錄下執(zhí)行 flutter pub get命令, 安裝第三方插件, 這個(gè)不用多說(shuō)了
2. 模型怎么寫, 哈哈哈, 按照以下代碼寫, 注意: 這些必須手寫
import 'package:hive/hive.dart';
@HiveType(typeId: 0) // typeId 范圍是0-233, 每個(gè)模型類的typeId應(yīng)不同
class CourseModel extends HiveObject {
// 課程編號(hào)
@HiveField(0) // 聲明courseId 是支持Hive的文件, 模型中的每個(gè)變量的HiveFiled 編號(hào)應(yīng)不同
int courseId = 0;
// 課程名稱
@HiveField(1)
String courseName = '';
// 課程背景圖片
@HiveField(2)
String courseCover = '';
// 課程內(nèi)容鏈接
@HiveField(3)
String courseContentUrl = '';
// 必須的構(gòu)造方法
CourseModel(
this.courseId,
this.courseName,
this.courseCover,
this.courseContentUrl,
);
}
3. 生成part XxxxModel.g.dart即適配器(XxxxModelAdapter.dart)文件
- 終端cd到項(xiàng)目目錄下, 執(zhí)行
注意: 執(zhí)行之前一定要先保存 Command + s, 一定要保存
flutter packages pub run build_runner build
- 執(zhí)行完成之后會(huì)有一個(gè)警告, 而且你會(huì)發(fā)現(xiàn)并沒(méi)有自動(dòng)生成任何相關(guān)文件
[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';
- 復(fù)制警告結(jié)尾的
part 'CourseModel.g.dart'; - 粘貼到如下代碼 . 注意此時(shí)會(huì)報(bào)錯(cuò), 顯示紅色波浪線, 不用關(guān)心, 繼續(xù)看下一步
import 'package:hive/hive.dart';
// 粘貼到這里, 注意不能在import xxx; 上邊, 會(huì)報(bào)錯(cuò)
part 'CourseModel.g.dart';
@HiveType(typeId: 0) // typeId 范圍是0-233, 每個(gè)模型類的typeId應(yīng)不同
class CourseModel extends HiveObject {...}
- 再次執(zhí)行
注意: 執(zhí)行之前一定要先保存 Command + s, 一定要保存
flutter packages pub run build_runner build
這時(shí)你就會(huì)發(fā)現(xiàn)文件目錄中多出來(lái)一個(gè)文件
CourseModel.g.dart點(diǎn)進(jìn)去看這個(gè)類的聲明, 你就會(huì)發(fā)現(xiàn)
CourseModelAdapter適配器類
4. 注冊(cè)適配器
想要存儲(chǔ)這個(gè)類, 需要注冊(cè)這個(gè)HiveObject對(duì)象的適配器
在程序入口注冊(cè), 如下:
import 'package:hive_flutter/hive_flutter.dart';
// 項(xiàng)目基礎(chǔ)異步初始化
Future setup() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Hive
await Hive.initFlutter();
// 注意, 注冊(cè)適配器不可以是```await```, 不信你試試, 注冊(cè)函數(shù)的參數(shù)是適配器的實(shí)例化對(duì)象
Hive.registerAdapter(CourseModelAdapter());
}
// 修改為如下樣子
// 調(diào)用 await setup()
void main() async {
await setup();
runApp(const MyApp());
}
5. 封裝可全局調(diào)用的單例對(duì)象
核心思路, 充分使用 setter和getter方法, 來(lái)便捷讀寫
import 'package:hive/hive.dart';
import 'package:test_demo/pages/PublicModel/CourseModel.dart';
class Database {
static final Database shared = Database();
// 這個(gè)盒子需要先打開, 合適的位置是 程序入口
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';
// 對(duì)象存儲(chǔ)盒子的名稱
final objectHiveName = 'objectHiveName';
// 項(xiàng)目基礎(chǔ)異步初始化
Future setup() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Hive
await Hive.initFlutter();
// 打開對(duì)象存儲(chǔ)盒子
await Hive.openBox(objectHiveName);
// 注意, 注冊(cè)適配器不可以是```await```, 不信你試試, 注冊(cè)函數(shù)的參數(shù)是適配器的實(shí)例化對(duì)象
Hive.registerAdapter(CourseModelAdapter());
}
// 調(diào)用 await setup()
void main() async {
await setup();
runApp(const MyApp());
}
6. 使用示例
testdemo() {
var course = CourseModel(
111,
'Hive對(duì)象存儲(chǔ)',
'http://xxxx.ccc',
'http://xxxx.ccc',
);
// 存入
Database.shared.courseModel = course;
// 獲取:
var model = Database.shared.courseModel;
}