Flutter Cache Manager

キャッシュライブラリFlutterDartファイルキャッシュネットワーク画像キャッシュ

キャッシュライブラリ

Flutter Cache Manager

概要

Flutter Cache Managerは、Flutterアプリケーション向けのジェネリックキャッシュマネージャーです。デバイスのストレージにWebファイルを保存し、SQLiteを使ってキャッシュ情報を管理します。効率的で信頼性の高いキャッシュ機能の実装を可能にする必須ツールです。

詳細

Flutter Cache Managerは、Cache-Control HTTPヘッダーを使用してファイルを効率的に取得し、maxNrOfCacheObjectsとstalePeriodの2つの変数を使ってファイルの削除タイミングを決定します。キャッシュにファイルがある場合は常に直接返され、その後でファイルが実際にまだ有効かどうかが確認されます。Cache-Controlヘッダーに従ってファイルが古いと判定された場合、マネージャーはファイルの更新を試行し、新しいファイルをキャッシュに保存します。

キャッシュクリーニングは継続的に実行され、オブジェクト数が多すぎる場合は最後の使用順序でファイルを削除し、stale期間を超えて使用されていないファイルも削除します。thread-safeな実装により、複数のgoroutineから安全に使用できます。

メリット・デメリット

メリット

  • Cache-Control HTTPヘッダーの自動処理
  • ファイルの有効性チェックとバックグラウンド更新
  • SQLiteベースの永続化キャッシュ情報管理
  • 設定可能なキャッシュサイズと有効期限
  • ファイルの保存/読み込み機能(c.Items()とNewFrom())
  • thread-safe設計で並行処理に対応
  • 画像、動画、その他のネットワークリソースのキャッシュに最適

デメリット

  • 同じキーで複数のCacheManagerインスタンスを作成すると競合する
  • ネットワーク越しのシリアライゼーションが不要なため、他のキャッシュシステムとの互換性が限定的
  • Flutter/Dart専用で他のプラットフォームでは使用できない
  • 大量のファイルキャッシュ時のストレージ使用量に注意が必要

参考ページ

書き方の例

基本的なセットアップ

import 'package:flutter_cache_manager/flutter_cache_manager.dart';

// DefaultCacheManagerを使用
final cacheManager = DefaultCacheManager();

// 単一ファイルの取得
File file = await cacheManager.getSingleFile(url);

// ファイルストリームの取得(最初にキャッシュ、後でダウンロード)
Stream<FileResponse> fileStream = cacheManager.getFileStream(url);

カスタムキャッシュマネージャーの作成

import 'package:flutter_cache_manager/flutter_cache_manager.dart';

class CustomCacheManager {
  static const key = 'customCacheKey';
  
  static CacheManager instance = CacheManager(
    Config(
      key,
      stalePeriod: const Duration(days: 7),
      maxNrOfCacheObjects: 100,
      repo: JsonCacheInfoRepository(databaseName: key),
      fileService: HttpFileService(),
    ),
  );
}

// 使用例
File file = await CustomCacheManager.instance.getSingleFile(url);

キャッシュされたファイルの削除

// 特定のURLのキャッシュを削除
await cacheManager.removeFile(url);

// すべてのキャッシュを削除
await cacheManager.emptyCache();

// 期限切れファイルのみ削除
await cacheManager.cleanUp();

ファイル情報の確認

// キャッシュからファイル情報を取得
FileInfo? fileInfo = await cacheManager.getFileFromCache(url);

if (fileInfo != null) {
  print('ファイルパス: ${fileInfo.file.path}');
  print('有効期限: ${fileInfo.validTill}');
  print('元URL: ${fileInfo.originalUrl}');
}

進行状況を含むダウンロード

Stream<FileResponse> stream = cacheManager.getFileStream(
  url,
  headers: {'Authorization': 'Bearer token'},
);

await for (FileResponse response in stream) {
  if (response is DownloadProgress) {
    print('ダウンロード進行: ${response.downloaded} / ${response.totalSize}');
  } else if (response is FileInfo) {
    print('ファイル取得完了: ${response.file.path}');
  }
}

有効期限付きキャッシュ

// 特定の有効期限でファイルをキャッシュ
File file = await cacheManager.getSingleFile(
  url,
  headers: {'Cache-Control': 'max-age=3600'}, // 1時間
);

// キャッシュマネージャー設定で全体の有効期限を設定
CacheManager(
  Config(
    'myCache',
    stalePeriod: const Duration(hours: 1),
    maxNrOfCacheObjects: 50,
  ),
);