flutter 我得到一个奇怪的错误时,试图初始化Hive

qv7cva1a  于 2023-05-19  发布在  Flutter
关注(0)|答案(8)|浏览(249)

错误: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);
  }

叫。
我不明白。我想我做的都对了。如果你还需要什么就告诉我。

svujldwt

svujldwt1#

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()

x6492ojm

x6492ojm2#

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

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);
}
uqjltbpv

uqjltbpv3#

目前,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,
    );
}
7ivaypg9

7ivaypg94#

我得到这个错误是因为一个错字:

await Hive.initFlutter;

应该是

await Hive.initFlutter();
vdgimpew

vdgimpew5#

我猜你得到这个问题是因为你没有等待initFlutter

import 'package:get/get.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart' as path_provider;

Future<void> yourFunction() async {
  final dbDir = await path_provider.getApplicationDocumentsDirectory();

  // init hive
  await Hive.initFlutter(dbDir.path);
  await openYourBox();
}
hgncfbus

hgncfbus6#

我认为你应该等待你的init方法。

z18hc3ub

z18hc3ub7#

只要遵循这些步骤,问题就会得到解决。导入这两个包

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

然后使用hive

await Hive.initFlutter();
await Hive.openBox('cache');
jvidinwx

jvidinwx8#

实际上,您不需要使用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,只有当你在移动的上使用它。

相关问题