Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unhandled Exception: HiveError: This should not happen. Please open an issue on GitHub. #370

Closed
nivla360 opened this issue Jul 11, 2020 · 2 comments
Assignees
Labels
needs-author-feedback Needs feedback from author problem An unconfirmed bug.

Comments

@nivla360
Copy link

nivla360 commented Jul 11, 2020

Steps to Reproduce
I'm using the provider package and this usually happens when I do the one of the following or together I don't really know the sequence:

  1. When I call box.close() on dispose of my page
  2. When a box is opened and I do a hot reload
  3. Sometimes when I try to close a box it throws another exception: box is not opened even though I check if the box is opened before I close

Code sample

class ChatListBloc extends ChangeNotifier {
  bool _isLoading = true;
  DatabaseReference _chatListRef = FirebaseDatabase.instance
      .reference()
      .child('chat_list');

  bool get isLoading => _isLoading;
  set isLoading(bool isLd){
    _isLoading = isLd;
    notifyListeners();
  }

  List get chatList => Hive.box('chat_list').values.toList(growable: false).sortedByDescending((element) => element[time_stamp]);    
void getChatList() async {
    if (!Hive.isBoxOpen('chat_list'))
      await Hive.openBox('chat_list');
    _loadOnlineData();
    await Future.delayed(Duration(milliseconds: 500));
    if(Hive.box('chat_list').isNotEmpty)
      {
        isLoading = false;
      }
  }

  disposeBox() async {
    if (Hive.isBoxOpen('chat_list'))
       await Hive.box('chat_list').close();
  }

  _loadOnlineData() async {
    if(await utilClass.isConnected()){
      if (!Hive.isBoxOpen('chat_list'))
        await Hive.openBox('chat_list');
      _chatListRef = FirebaseDatabase.instance
          .reference()
          .child('chat_list')
          .child(uId]).onValue.listen((event) {
        if (event.snapshot.value != null) {
          event.snapshot.value.forEach((key1, value) async {
            value[key] = key1;
            await Hive.box('chat_list').put(key1, value);
          });
        }
        isLoading = false;
      });
    }
  }
}

Provide a few simple lines of code to show your problem.

E/flutter (25930): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: HiveError: Box not found. Did you forget to call Hive.openBox()?
E/flutter (25930): #0      HiveImpl._getBoxInternal (package:hive/src/hive_impl.dart:146:7)
E/flutter (25930): #1      HiveImpl.box (package:hive/src/hive_impl.dart:157:33)
E/flutter (25930): #2      ChatListBloc.getChatList (package:.../bloc/chat_list_bloc.dart:32:13)
E/flutter (25930): <asynchronous suspension>
E/flutter (25930): #3      _MessagesState._body (package:.../ui/messages.dart:124:19)
E/flutter (25930): #4      _MessagesState.build (package:.../ui/messages.dart:51:13)
E/flutter (25930): #5      StatefulElement.build (package:flutter/src/widgets/framework.dart:4628:28)
E/flutter (25930): #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4511:15)
E/flutter (25930): #7      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4684:11)
E/flutter (25930): #8      Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #9      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4490:5)
E/flutter (25930): #10     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter (25930): #11     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4485:5)
E/flutter (25930): #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3455:14)
E/flutter (25930): #13     Element.updateChild (package:flutter/src/widgets/framework.dart:3223:18)
E/flutter (25930): #14     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5839:14)
E/flutter (25930): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3455:14)
E/flutter (25930): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:3223:18)
E/flutter (25930): #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #18     Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4490:5)
E/flutter (25930): #20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4485:5)
E/flutter (25930): #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3455:14)
E/flutter (25930): #22     Element.updateChild (package:flutter/src/widgets/framework.dart:3220:20)
E/flutter (25930): #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #24     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4684:11)
E/flutter (25930): #25     Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #26     StatefulElement.update (package:flutter/src/widgets/framework.dart:4716:5)
E/flutter (25930): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #28     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5846:14)
E/flutter (25930): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #31     Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #32     StatelessElement.update (package:flutter/src/widgets/framework.dart:4592:5)
E/flutter (25930): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #34     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5846:14)
E/flutter (25930): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #37     Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #38     StatelessElement.update (package:flutter/src/widgets/framework.dart:4592:5)
E/flutter (25930): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #40     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #41     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4684:11)
E/flutter (25930): #42     Element.rebuild (package:flutter/src/widgets/framework.dart:4227:5)
E/flutter (25930): #43     StatefulElement.update (package:flutter/src/widgets/framework.dart:4716:5)
E/flutter (25930): #44     Element.updateChild (package:flutter/src/widgets/framework.dart:3210:15)
E/flutter (25930): #45     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4536:16)
E/flutter (25930): #46     StatefulElement.performRebuild 

Version

  • Platform: Android, haven't test it on other platforms
  • Flutter version: 1.19.0-4.1.pre • channel beta •
  • Hive version: 1.4.1+1
@nivla360 nivla360 added the problem An unconfirmed bug. label Jul 11, 2020
@themisir
Copy link
Contributor

themisir commented Jul 13, 2020

I am usually doing like this:

class SomeBloc {
  Box _box;

  Future<void> _openBox() async {
    if (_box != null) return;
    _box = await Hive.openBox('boxName');
  }

  Future<void> initialize() async {
    final List
  }

  void dispose() {
    _box?.close();
    _box = null;
  }

  Future<void> _loadOnlineData() async {
    if (await utilClass.isConnected()){
      await _openBox();
      _chatListRef = FirebaseDatabase.instance
          .reference()
          .child('chat_list')
          .child(uId]).onValue.listen((event) async {
        if (event.snapshot.value != null) {
          // I prefer native `for` loop here instead of .forEach method, because .forEach method is not awaiting async calls
          event.snapshot.value.forEach((key1, value) async {
            value[key] = key1;
            _box.put(key1, value);
          });
        }
        isLoading = false;
      });
    }
  }
}

@themisir themisir added the needs-author-feedback Needs feedback from author label Jul 23, 2020
@themisir
Copy link
Contributor

Duplicate of #263

@themisir themisir marked this as a duplicate of #263 Aug 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
needs-author-feedback Needs feedback from author problem An unconfirmed bug.
Projects
None yet
Development

No branches or pull requests

3 participants