Logo

The Unbound Academy

Flutter Multi-Platform Development

Flutter Hive Async Operations

Flutter
Riverpod
Riverpod

Step 1: Understanding Sync vs. Async

Sync (Synchronous): Executes tasks sequentially and blocks the execution of other tasks until completion.

  • Example: Opening a box synchronously might freeze the app if the operation takes time.
  • Use Case: For quick, non-blocking tasks.

Async (Asynchronous): Executes tasks in the background and allows other tasks to proceed.

  • Example: Opening a box asynchronously allows the app to remain responsive.
  • Use Case: For tasks that might take time, like reading or writing large data.

Step 2: When to Use Async in Hive

Use Async if:

  • You are working with large datasets.
  • You need to access Hive operations in a way that doesn’t block the UI.
  • You are performing multiple read/write operations.
  • You are using await to handle asynchronous operations.

Step 3: Opening Boxes Asynchronously

Use Hive.openBox() with await to open a box in the background.

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final directory = await getApplicationDocumentsDirectory();
  Hive.init(directory.path);

  // Open the box asynchronously
  var box = await Hive.openBox('myBox');

  // Use the box after it's opened
  await box.put('key', 'value');
  print(await box.get('key')); // Outputs: value
}

Step 4: Writing Data Asynchronously

Writing data can also be done asynchronously using await:

await box.put('username', 'JohnDoe'); // Write data without blocking the UI

Step 5: Reading Data Asynchronously

Similarly, you can read data asynchronously:

String username = await box.get('username');
print(username); // Outputs: JohnDoe

Step 6: Using Async Operations in Widgets

In a Flutter widget, use a FutureBuilder to work with async Hive operations:

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

class HomePage extends StatelessWidget {
  final Future<Box> boxFuture = Hive.openBox('myBox'); // Open box asynchronously

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Async Hive Example')),
      body: FutureBuilder<Box>(
        future: boxFuture, // Pass the future
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          } else {
            final box = snapshot.data;
            return Center(
              child: Text('Stored Value: ${box?.get('key') ?? 'No Data'}'),
            );
          }
        },
      ),
    );
  }
}

Step 7: When Not to Use Async

Do not use Async if:

  • The data operations are trivial (e.g., writing a small value like a boolean or integer).
  • You are frequently accessing boxes that are already open.

Step 8: Debugging Sync vs. Async Issues

  • Symptom: UI freezing or delayed interactions.
  • Solution: Use async methods with await.
  • Symptom: Data not available immediately.
  • Solution: Ensure you are using await properly or check if the box is open.

Quick Summary

Use Async for:

  • Time-consuming operations.
  • Large datasets or multiple operations.
  • Keeping the UI responsive.

Use Sync for:

  • Small, quick operations on already opened boxes.
  • When performance isn’t an issue.