ISARとは
FlutterのISARパッケージは、アプリ内にローカルデータベースを構築し、データを管理・永続化するためのものです。
ISARの主な特徴は以下の通りです。
- シンプルなAPIでのデータベース操作が可能
- 非同期処理がデフォルトで利用できる
- リレーショナルデータベースのような関連付けが可能
- コレクションに対応している
- トランザクションに対応している
- 変更ストリームをサポートしている
- 型安全でFlutterとの親和性が高い
データベースの定義はモデルクラスを作成するだけで、テーブルの自動生成やスキーマのマイグレーションも容易です。
また、ストリームを利用したリアルタイムな変更の監視や、トランザクションによる一括処理も安全に行えます。
作成や更新などの基本的なCRUD操作から、連鎖更新削除、複雑なJOIN問い合わせまで柔軟に対応できるため、比較的大規模なアプリにも向いています。
処理速度の面でも他のパッケージと比べて優れており、実運用向けアプリのストレージとして選択肢の一つとなります。
何故ISARを使うのか
Flutterでトークン管理を実装する場合、ISARを使うメリットは以下の点があげられます。
オブジェクト指向のデータベース操作が可能
ISARはSQLiteの上に抽象化された層を提供します。モデルクラスだけ定義すれば、テーブルの作成やオブジェクトのマッピングが自動で行われるため、構築が容易です。
非同期処理にデフォルト対応している
ISARではデータベースの操作がFutureベースで提供されているので、UIのブロッキングを避けられます。
リアクティブなデータ更新
Streamを利用したリアルタイムな変更の監視ができるため、トークンの有効期限切れなどを検知しやすいです。
安全なトランザクション操作が可能
トークン保存と削除を1つのトランザクションとして扱えるので、データの不整合が発生しにくくなります。
以上の理由から、ISARを使うことで安全・柔軟にトークン情報を管理できると考えられます。
結論
尚、今回のログイン処理だけを考えるとXSRF-TOKENやISARは不要ですが、ログイン後の処理で、アクセストークンやXSRF-TOKENは必要ですので、ISARのようなデータベースに保存して、処理するのがベストだと思います。
ですので、ログイン時にアクセストークンやXSRF-TOKENを保存するように処理を書いていきたいと思います。
ISARのインストール
ISARを利用するには、下記の4つのパッケージをインストールする必要があります。
- isar:ISARのコアライブラリです。データベースの操作に必要な関数やクラスが含まれています。
- isar_flutter_libs:FlutterでISARを利用するためのラッパーライブラリです。Async操作などのサポートが含まれています。
- isar_generator:モデルクラスから自動でスキーマ情報を生成するジェネレーターです。コード生成にbuild_runnerと併用します。
- build_runner:isar_generatorやfreezedなど、コード生成を行うパッケージとセットで利用します。コードの自動生成を実行します。
尚、上記のうち、build_runnerは以前インストールしているので、残りの3つを下記のコマンドでインストールします。
flutter pub add isar
flutter pub add isar_flutter_libs
flutter pub add isar_generator
flutter pub add path_provider
IASRの使用例
モデルの作成
例としてISARをRiverpodで使用する前提で説明します。、アクセストークンとCSRFトークンを保存するためのモデルをISARで作成します。
import 'package:isar/isar.dart';
part 'token_model.g.dart';
@Collection()
class TokenModel {
Id id = Isar.autoIncrement; // Isarの主キー
late String accessToken;
late String csrfToken;
}
build_runnerでモデルを生成します。
flutter pub run build_runner build --delete-conflicting-outputs
Riverpodプロバイダーの作成
トークンを管理するためのRiverpodのプロバイダーを作成します。このプロバイダーは、トークンを保存し、取得するためのロジックをカプセル化します。
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../models/token_model.dart';
final tokenProvider =
StateNotifierProvider<TokenNotifier, TokenModel?>((ref) => TokenNotifier());
class TokenNotifier extends StateNotifier<TokenModel?> {
TokenNotifier() : super(null);
void setToken(String accessToken, String csrfToken) {
state = TokenModel()
..accessToken = accessToken
..csrfToken = csrfToken;
}
void clearToken() {
state = null;
}
}
このプロバイダーを使用して、トークンの状態をアプリケーション全体で管理できます。例えば、ログイン後にトークンを設定したり、ログアウト時にトークンをクリアしたりできます。
ISARプロバイダーの作成
ISARを管理するためのプロバイダーを作成します。
hooks_riverpodを使用する場合、Isarのインスタンスはプロバイダを通じて管理されるべきです。これにより、状態管理がより宣言的になり、コードがより整理されます。
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:path_provider/path_provider.dart';
import '../models/token_model.dart';
final isarProvider = FutureProvider<Isar>((ref) async {
final directory = await getApplicationDocumentsDirectory();
return await Isar.open(
[TokenModelSchema],
directory: directory.path,
);
});
ISARの初期化
MyAppクラスでisarインスタンスを使用します。
MyAppクラスでisartインスタンスにアクセスする場合は、WidgetRefを使用します。
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../providers/isar_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(isarProvider);
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'),
),
);
}
}
導入における注意点
isarデータベースは、現時点でWebプラットフォームのサポートに関して進行中の作業があるようですが、まだ完全には実装されていないようです。GitHubのディスカッションによると、Webサポートは将来的にWebAssembly (WASM) モジュールを通じて提供される可能性があります。この解決策では、ブラウザの外部で動作するストレージレイヤー(SQLiteとIsar Coreの統合)がFFIまたはJavaScriptブリッジを通じてアクセス可能になるとされています。
また、Isarの公式ウェブサイトには、IsarがFlutter向けに特化した、高速でクロスプラットフォーム対応のデータベースとして紹介されていますが、ここではiOS、Android、デスクトップのサポートについてのみ言及されており、Webについての具体的な言及はありません。
現在のところ、IsarのWebサポートは完全に実現されているわけではなく、将来的な対応が期待されている状況です。最新の情報については、IsarのGitHubページや公式ウェブサイトを定期的にチェックすることをお勧めします。
コメント