'I get a weird error when trying to initialize Hive

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

Essentially I have these in my dependencies so everything should be good.

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

I also have import 'package:hive/hive.dart'; and import 'package:path_provider/path_provider.dart'; in the file

So I just have

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

called.

I do not understand. I think I've done everything correct. Let me know if you need something else.



Solution 1:[1]

Hive needs to be initialized when it runs on Android or iOS, therefore you can use a function like this:

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

You'll need to import path_provider in order to access getApplicationDocumentsDirectory()

Solution 2:[2]

Try the following code on the main function of your flutter application:

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

Solution 3:[3]

Currently, path_provider doesn't support WEB. You can see it here: path_provider.

You have to use another directory for WEB. If you are using BLOC as a state management, you could do something like this:

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

Solution 4:[4]

I got this error because of a typo:

await Hive.initFlutter;

should've been

await Hive.initFlutter();

Solution 5:[5]

I guess you are getting this issue because you are not awaiting the 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();
}

Solution 6:[6]

I think you should await your init method.

Solution 7:[7]

Actually you don't need use HydratedStorage to initialize Hive on web:

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

If you're using Flutter on web, you don't need to initialize Hive and neither provider a path to box, only if you're using it on mobile.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Leonardo Rignanese
Solution 2
Solution 3 S. M. JAHANGIR
Solution 4 buckleyJohnson
Solution 5 Nirjan Munshi
Solution 6 Saad Lembarki
Solution 7 Lucas de Miranda Lima