美文网首页
Flutter 数据库-Hive插件-存储对象

Flutter 数据库-Hive插件-存储对象

作者: YourSummer | 来源:发表于2023-03-16 08:48 被阅读0次

    先决条件:

    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. 封装可全局调用的单例对象
    核心思路, 充分使用 settergetter方法, 来便捷读写
    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;
    }
    

    特别提示: 在执行 flutter packages pub run build_runner build之前一定要先保存

    相关文章

      网友评论

          本文标题:Flutter 数据库-Hive插件-存储对象

          本文链接:https://www.haomeiwen.com/subject/govrrdtx.html