Flutter 數(shù)據(jù)庫(kù)-Hive插件-存儲(chǔ)對(duì)象

先決條件:

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ì)象
核心思路, 充分使用 settergetter方法, 來(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;
}

特別提示: 在執(zhí)行 flutter packages pub run build_runner build之前一定要先保存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容