Database Setup & Custom Adapters


hive_ce on pub.dev↗
dependencies:
  hive_ce: latest
  hive_ce_flutter: latest

Basic

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

import 'package:hive_ce_flutter/hive_flutter.dart';

void main() async {
  await Hive.initFlutter();
  await Hive.openBox("fruits");

  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(body: const MyApp()),
      darkTheme: ThemeData.dark(),
      themeMode: .dark,
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final box = Hive.box("fruits");

  @override
  Widget build(BuildContext context) {
    return Column(
      spacing: 24,
      crossAxisAlignment: .stretch,
      mainAxisAlignment: .center,
      children: [
        Text(
          box.get("isDarkMode", defaultValue: false).toString(),
          textAlign: .center,
        ),

        TextButton(
          onPressed: () {
            box.put("isDarkMode", null);
            setState(() {});
          },
          child: Text("save"),
        ),

        TextButton(
          onPressed: () {
            box.delete("isDarkMode");
            setState(() {});
          },
          child: Text("delete"),
        ),
      ],
    );
  }
}

Box<T>

type specific counter
import 'package:flutter/material.dart';
import 'package:hive_ce/hive.dart';
import 'package:hive_ce_flutter/hive_ce_flutter.dart';

void main() async {
  await Hive.initFlutter();
  await Hive.openBox<int>('counter');

  runApp(
    MaterialApp(
      home: const MyApp(),
      darkTheme: ThemeData.dark(),
      themeMode: .dark,
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final counter = Hive.box<int>('counter');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: .all(8.0),
        child: ElevatedButton(
          onPressed: () {
            counter.put("v1", counter.get("v1", defaultValue: 0)! + 1);
            setState(() {}); // to refresh  the ui
          },
          child: Text("counter ${counter.get("v1").toString()}"),
        ),
      ),
    );
  }
}

Custom adapter

import 'package:flutter/material.dart';
import 'package:hive_ce/hive.dart';
import 'package:hive_ce_flutter/hive_ce_flutter.dart';

class User {
  new({required this.name, required this.dob});

  final String name;
  final DateTime dob;
  @override
  String toString() {
    return "User(name: $name, dob: $dob)";
  }
}

class UserAdapter extends TypeAdapter<User> {
  @override
  final int typeId = 0;

  @override
  User read(BinaryReader reader) {
    return User(name: reader.read(), dob: reader.read());
  }

  @override
  void write(BinaryWriter writer, User obj) {
    writer.write(obj.name);
    writer.write(obj.dob);
  }
}

void main() async {
  await Hive.initFlutter();

  Hive.registerAdapter(UserAdapter());
  await Hive.openBox<User>('users');

  runApp(
    MaterialApp(
      home: const MyApp(),
      darkTheme: ThemeData.dark(),
      themeMode: .dark,
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final controller = TextEditingController();
  final userBox = Hive.box<User>("users");

  void add() async {
    await userBox.put(0, User(name: controller.text, dob: DateTime.now()));
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          padding: .all(8.0),
          child: Column(
            spacing: 24,
            crossAxisAlignment: .stretch,
            mainAxisSize: .min,
            children: [
              Text(userBox.get(0).toString()),

              TextFormField(
                controller: controller,
                decoration: InputDecoration(border: OutlineInputBorder()),
              ),
              ElevatedButton(onPressed: add, child: Text("add user")),
            ],
          ),
        ),
      ),
    );
  }
}

Generate adapter

To generate adapters, use hive_ce_generator and build_runner.

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^6.0.0
  hive_ce_generator: any
  build_runner: any
// lib/hive/hive_adapters.dart
import 'package:hive_ce/hive_ce.dart';
import 'package:hive_temp_exc/main.dart';

@GenerateAdapters([AdapterSpec<User>()])
part 'hive_adapters.g.dart';
main.dart
/// main.dart
import 'package:flutter/material.dart';
import 'package:hive_ce/hive.dart';
import 'package:hive_ce_flutter/hive_ce_flutter.dart';
import 'package:hive_temp_exc/hive/hive_registrar.g.dart';

class User {
  const User({required this.name, required this.dob});

  final String name;
  final DateTime dob;
  @override
  String toString() {
    return "User(name: $name, dob: $dob)";
  }
}

void main() async {
  Hive
    ..init(".")
    ..registerAdapters();

  await Hive.openBox<User>('users');

  runApp(
    MaterialApp(
      home: const MyApp(),
      darkTheme: ThemeData.dark(),
      themeMode: .dark,
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final controller = TextEditingController();
  final userBox = Hive.box<User>("users");

  void add() async {
    await userBox.put(0, User(name: controller.text, dob: DateTime.now()));
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          padding: .all(8.0),
          child: Column(
            spacing: 24,
            crossAxisAlignment: .stretch,
            mainAxisSize: .min,
            children: [
              Text(userBox.get(0).toString()),

              TextFormField(
                controller: controller,
                decoration: InputDecoration(border: OutlineInputBorder()),
              ),
              ElevatedButton(onPressed: add, child: Text("add user")),
            ],
          ),
        ),
      ),
    );
  }
}