【问题标题】:I get a weird error when trying to initialize Hive尝试初始化 Hive 时出现奇怪的错误
【发布时间】:2021-04-27 08:58:02
【问题描述】:

错误:Unhandled Exception: HiveError: You need to initialize Hive or provide a path to store the box.

基本上我的依赖项中有这些,所以一切都应该很好。

  hive: ^1.4.4+1
  hive_flutter: ^0.3.1
  path_provider: ^1.6.27

我也有import 'package:hive/hive.dart'; 和 文件中的import 'package:path_provider/path_provider.dart';

所以我有

void doSomething() async {
    final documentDirectory = await getApplicationDocumentsDirectory();
    Hive.init(documentDirectory.path);
  }

调用。

我不明白。我想我做的一切都是正确的。如果您还需要其他东西,请告诉我。

【问题讨论】:

    标签: flutter flutter-hive


    【解决方案1】:

    目前,path_provider 不支持 WEB。你可以在这里看到它:path_provider

    您必须为 WEB 使用另一个目录。如果你使用 BLOC 作为状态管理,你可以这样做:

    if (!kIsWeb) {
        // if android or tablet
        HydratedBloc.storage = await HydratedStorage.build(
            storageDirectory: await getApplicationDocumentsDirectory(),
        );
    } else {
        // if web
        HydratedBloc.storage = await HydratedStorage.build(
            storageDirectory: HydratedStorage.webStorageDirectory,
        );
    }
    

    【讨论】:

      【解决方案2】:

      Hive在Android或iOS上运行时需要初始化,所以你可以使用这样的函数:

      Future<Box> openHiveBox(String boxName) async {
          if (!kIsWeb && !Hive.isBoxOpen(boxName)) 
            Hive.init((await getApplicationDocumentsDirectory()).path);
          
          return await Hive.openBox(boxName);
      }
      

      您需要导入path_provider 才能访问getApplicationDocumentsDirectory()

      【讨论】:

        【解决方案3】:

        其实你不需要使用 HydratedStorage 在 web 上初始化 Hive:

        import 'package:hive/src/hive_impl.dart';
        import 'package:flutter/foundation.dart';
        import 'package:path_provider/path_provider.dart';
        
        initializeHive()async{
          //Use HiveImpl() to ensure you don't have conflicting Hive boxes.
          HiveInterface _hive = HiveImpl();
          if (kIsWeb) {
            await _hive.openBox('yourBoxName');
          } else {
            var dir = await getApplicationDocumentsDirectory();
            _hive.init(dir.path);
            await _hive.openBox('yourBoxName');
          }
        }
        

        如果你在 web 上使用 Flutter,你不需要初始化 Hive,也不需要提供 box 的路径,只有当你在移动设备上使用它时。

        【讨论】:

          猜你喜欢
          • 2019-07-25
          • 1970-01-01
          • 2023-03-07
          • 2011-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多