user3121527
user3121527

Reputation: 1

How to fix hive box already open error in flutter?

I am trying to use hive to store data on a local machine using hive but each time when I compile the code it gives the error "The box "notebook" is already open and of type Box." Can someone help me to resolve the issue as I am new to it? Thanks

I am just trying to add data to the database in this app without any change to the state of the app interface. I have tried to change the main method to void but no luck on this.

All the code is located in the main file

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

import 'notes.dart';
import 'notesStoring.dart';
Future main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  Hive.registerAdapter(NotesAdapter());
  await Hive.openBox<NotesAdapter>('noteBook');
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);



  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  @override
  void dispose() {
    Hive.close();
    // TODO: implement dispose
    super.dispose();
  }
  @override


  Future incrementCounter(String title) async {
    final notes = Notes()
      ..title = title;
    final box =Boxes.getNotesValues();
    box.add(notes);
  }
  final titleForNotes=TextEditingController();
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body:

      Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            TextField(
              controller: titleForNotes,
              cursorColor: Colors.pink,
            ),
            ValueListenableBuilder<Box<Notes>>(valueListenable: Boxes.getNotesValues().listenable(), builder: (context,box,_){
              final noteBook =box.values.toList().cast<Notes>();
              return buildContent(noteBook);
            })
          ],

        ),


      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){
          incrementCounter(titleForNotes.text);
        },
        tooltip: 'Increment',
        child:  Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class Boxes {
  static Box<Notes> getNotesValues()=>Hive.box<Notes>('noteBook');
}
Widget buildContent(List<Notes> noteBook){
  return Column(
    children: [
      Expanded(child:
      ListView.builder(
          padding: EdgeInsets.all(8),
          itemCount: noteBook.length,
          itemBuilder: (BuildContext context, int index){
            final notes= noteBook[index];
            return buildTransaction(context, notes);
          }


      )

      )

    ],
  );

}

Widget buildTransaction(
    BuildContext context,
    Notes notes,
    ){
  return Card(
    color: Colors.green,
    child: Text(notes.title),
  );
}

Upvotes: 0

Views: 1140

Answers (1)

MhdBasilE
MhdBasilE

Reputation: 458

1.You can open your notebook Box in the main method of your app:

 Future<void> main() async {
   ...

    final appDocumentDirectory = await 
     path_provider.getApplicationDocumentsDirectory();
     Hive.init(appDocumentDirectory.path);
     Hive.registerAdapter(UserAdapter());
         // open the user box
       await Hive.openBox('notebook');

        _setUpLogging();

       runApp(MultiProvider(providers: providers, child: 
        StartupApplication()));
 }

2 Access the previously opened box like below:

class MyHomePage extends StatefulWidget {
    const MyHomePage({Key key}) : super(key: key);

    @override
     _MyHomePageState createState() => _MyHomePageState();
     }

      class _MyHomePageState extends State<MyHomePage> {
       // user box
         Box notebookBox;

 @override
   void initState() {
   super.initState();
   // get the previously opened user box
    notebookBox = Hive.box('notebook');
  }

          @override
      Widget build(BuildContext context) {
   // check for your conditions 
    return (notebookBox.values.isNotEmpty && notebookBox.get(0).active == 1)
     ? HomeView()
    : Intro();
     }
    }

Upvotes: 0

Related Questions