Hiveデータベースのインストール

Hiveは、Flutterで人気のあるキーバリュー型の軽量で高速なローカルデータベースです。FlutterアプリケーションでHiveを使用するためのステップは以下の通りです。

目次

Hiveのインストール

パッケージのインストール

以下のパッケージをインストールします。

flutter pub add hive
flutter pub add hive_flutter
flutter pub add hive_generator --dev
flutter pub add build_runner --dev

Hiveの使用例

例として、アクセストークンとCSRFトークンをDBに保存して、Riverpodで状態管理する方法を紹介しておきます。

モデルの作成

lib/models/token_model.dart
import 'package:hive/hive.dart';

part 'token_model.g.dart'; // Hiveジェネレーターが生成するファイル

@HiveType(typeId: 0)
class TokenModel {

  @HiveField(0)
  late String accessToken;

  @HiveField(1)
  late String csrfToken;

}

build_runnerを実行して、ジェネレーターを実行します。

flutter pub run build_runner build --delete-conflicting-outputs

HiveとRiverpodの統合

HiveをRiverpodで状態管理するために、hiveProviderを作成します。

lib/poviders/hive_provider
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
import '../models/token_model.dart';
import 'package:flutter/material.dart';

final hiveProvider = FutureProvider<Box<TokenModel>>((ref) async {
  final appDocDir = await getApplicationDocumentsDirectory();
  Hive.init(appDocDir.path);
  Hive.registerAdapter(TokenModelAdapter());
  return Hive.openBox<TokenModel>('tokens');
});

final tokenProvider = StateNotifierProvider<TokenNotifier, TokenModel?>((ref) {
  final box = ref.watch(hiveProvider.future);
  return TokenNotifier(box);
});

class TokenNotifier extends StateNotifier<TokenModel?> {
  Box<TokenModel>? _box;

  TokenNotifier(Future<Box<TokenModel>> boxFuture) : super(null) {
    _initialize(boxFuture);
  }

  Future<void> _initialize(Future<Box<TokenModel>> boxFuture) async {
    try {
      _box = await boxFuture;
      if (_box!.isNotEmpty) {
        state = _box!.get('token');
      }
    } catch (e) {
      debugPrint("Error initializing TokenNotifier: $e");
    }
  }

  void setToken(String accessToken, String csrfToken) async {
    final token = TokenModel()
      ..accessToken = accessToken
      ..csrfToken = csrfToken;
    await _box!.put('token', token);
    state = token;
  }

  void clearToken() async {
    await _box!.delete('token');
    state = null;
  }
}

Hiveの設定と初期化 ( hiveProvider)

  • getApplicationDocumentsDirectory: アプリケーションのドキュメントディレクトリへのパスを取得します。これは、Hiveデータベースファイルを保存する場所として使用されます。
  • Hive.init: Hiveデータベースの初期化を行います。
  • Hive.registerAdapter: TokenModelオブジェクトのシリアライズとデシリアライズを行うためのアダプタを登録します。
  • Hive.openBox: TokenModelオブジェクトを保存するHiveボックスを開きます。

トークンの状態管理 (tokenProvider)

  • StateNotifierProvider: TokenNotifierを使用して、TokenModelオブジェクトの状態を管理します。
  • ref.watch: hiveProviderの結果を監視し、Hiveボックスのインスタンスを取得します。

TokenNotifireクラス

TokenNotifierはTokenModelの状態を管理するためのクラスです。

  • コンストラクタ
    • boxFuture: 非同期で取得されるHiveボックスへの参照
    • _initialize: コンストラクタで非同期初期化を行います。
  • _initialize メソッド
    • hiveボックスのインスタンスを非同期に取得します。
    • 既に保存されているトークンがあれば、それを現在の状態として設定します。
    • iveボックスのインスタンスを非同期に取得します。
    • 既に保存されているトークンがあれば、それを現在の状態として設定します。
  • setToken メソッド
    • 与えられたアクセストークンとCSRFトークンを使用して、新しいTokenModelオブジェクトを作成します。 この新しいトークンをHiveボックスに保存し、現在の状態を更新します。
  • clearToken メソッド
    • Hiveボックスからトークンを削除し、現在の状態を nullに設定します。

エラーハンドリング

各メソッドにはエラーハンドリングが含まれており、何らかの問題が発生した場合にはデバッグ情報を出力します。

まとめ

このコードは、Hiveを使ってFlutterアプリケーション内でトークン情報を効率的に管理する方法を示しています。RiverpodのStateNotifierProviderを使用することで、アプリケーションの異なる部分から簡単にトークンの状態を読み取り、更新できるようになっています。

MyAppで呼び出す

hiveを使用するには、使用するウィジェットで呼び出します。

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'providers/hive_provider.dart';
import 'views/login_page.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const ProviderScope(child: MyApp()));
}

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

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final isarAsyncValue = ref.watch(hiveProvider);

    return MaterialApp(
      title: 'WinRoad',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: isarAsyncValue.when(
        data: (_) => LoginPage(),
        loading: () => const CircularProgressIndicator(),
        error: (error, stack) => Text('Error: $error'),
      ),
    );
  }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次