网站首页前端

Flutter用Hive插件封装本地存储

发布时间:2024-01-14 22:54:20编辑:阅读(226)

    一. 在pubspec.yaml中引入hive插件后, 执行flutter pub get

    dependencies:
        hive: ^2.2.3
        hive_flutter: ^1.1.0
    dev_dependencies:
        build_runner: ^2.3.3 #编译
        hive_generator: ^2.0.0 #用于生成对象存储适配器文件


    二. 手动添加model文件, 如models/userModel.dart, 内容按照下面的格式, 字段按需要修改:

    import 'package:hive/hive.dart';
    part 'userModel.g.dart';
    @HiveType(typeId: 0) // typeId 范围是0-233, 每个模型类的typeId应不同
    class UserModel extends HiveObject {
      @HiveField(0)
      String token = '';
      @HiveField(1)
      String mobile = '';
      @HiveField(2)
      String name = '';
      UserModel(
          this.token,
          this.mobile,
          this.name,
      );
    }


    三. 在终端下执行 flutter packages pub run build_runner build, 会自动生成models/userModel.g.dart.


    四. 封装可全局调用的单例对象, common/localStorage.dart

    import 'package:hive/hive.dart';
    import 'package:router/models/userModel.dart';
    class LocalStorage {
      static final LocalStorage shared = LocalStorage();
      // 这个盒子需要先打开, 合适的位置是 程序入口
      final box = Hive.box(objectHiveName);
      // App配置信息
      UserModel? get userModel => box.get("UserModel");
      set userModel(UserModel? value) => box.put("UserModel", value);
    }



    五. 在main.dart入口文件中加入:

    import 'common/localStorage.dart';
    const objectHiveName = 'localStorage';
    // 项目基础异步初始化
    Future setup() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Hive.initFlutter();
      Hive.registerAdapter(UserModelAdapter());
      await Hive.openBox(objectHiveName);
    }
    void main() async {
      await setup();
      runApp(MyApp());
    }


    六. 在页面中引入localStorage, 即可使用

        UserModel user = UserModel(
          "token",
          "mobile",
          "name",
        );
        LocalStorage.shared.userModel = user;


    七. 在使用hive中, 修改UserModel的内容, 重新生成UserModel.g.dart文件后,

    Hive会报错:  Unhandled Exception: type 'Null' is not a subtype of type 'String' in type cast

    这是因为Hive在缓存了UserModel数据, 新生成的model并未实际更新.

    这时需要在代码中执行一下:

    await Hive.box(objectHiveName).clear();


    清除一下缓存, 再修改后重新编译就可以了.



评论