尝试初始化 Hive 时出现奇怪的错误

6 flutter flutter-hive

错误: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
Run Code Online (Sandbox Code Playgroud)

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

所以我只有

void doSomething() async {
    final documentDirectory = await getApplicationDocumentsDirectory();
    Hive.init(documentDirectory.path);
  }
Run Code Online (Sandbox Code Playgroud)

叫。

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

Leo*_*ese 7

Hive在 Android 或 iOS 上运行时需要初始化,因此可以使用如下函数:

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

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


Pra*_*ari 7

在 flutter 应用程序的 main 函数上尝试以下代码:

import 'package:path_provider/path_provider.dart';
import 'package:hive/hive.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final appDocumentDirectory = await getApplicationDocumentsDirectory();
  Hive.init(appDocumentDirectory.path);
}
Run Code Online (Sandbox Code Playgroud)


小智 0

目前,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,
    );
}
Run Code Online (Sandbox Code Playgroud)