CachedNetworkImageは、プログレスインジケーター、プレースホルダー、エラーハンドリングをサポートし、ネットワークから画像を読み込んでキャッシュするFlutterウィジェットです。公式パッケージページによると、このライブラリはflutter_cache_managerをベースにしており、設定可能なTTLで自動ディスクキャッシュを提供します。CachedNetworkImageは、キャッシュを用いたFlutterアプリケーションでの画像読み込みの標準的なソリューションです。
重要なポイント
CachedNetworkImageは、pub.devの同名パッケージのFlutterウィジェットで、自動キャッシュによるネットワーク画像読み込みを提供します。標準のImage.networkをラップし、ファイルキャッシュ、プログレスインジケーター、カスタムエラーハンドリングを追加します。
内部的には、CachedNetworkImageはflutter_cache_manager — ファイル追跡用のSQLiteデータベースを持つキャッシュマネージャー — を使用します。最初のリクエストでは画像がネットワークからダウンロードされディスクに保存され、後続のリクエストではTTL(デフォルト7日)を考慮してキャッシュから提供されます。インメモリキャッシュはFlutterの標準ImageCacheによって管理されます。
このパッケージはpub.devで4,000以上のいいねを獲得しており、何千ものFlutterプロジェクトで使用されています。CachedNetworkImageはすべてのFlutterプラットフォーム(Android、iOS、Web、macOS、Windows、Linux)をサポートしています。統一されたAPIにより、開発者はプラットフォーム固有のコードなしでクロスプラットフォームの画像読み込みを実現できます。
Flutterは2レベルのキャッシュシステムを使用します:ImageCache(メモリ)とflutter_cache_manager(ディスク+SQLite)。ImageCacheは、デコード済み画像のグローバルキャッシュで、数(デフォルト1000)とサイズ(デフォルト100 MB)に制限があります。flutter_cache_managerはディスク上のファイルとそのメタデータを管理します。
CachedNetworkImageが画像リクエストを受け取ると、最初にFlutterのImageCacheをチェックします — 画像がすでにメモリにデコードされている場合は即座に表示されます。キャッシュミスの場合、flutter_cache_managerを介してディスクがチェックされます:SQLiteクエリでファイルがキャッシュに存在するか、TTLが期限切れかどうかを確認します。ファイルが有効な場合 — ディスクから読み込まれ、デコードされ、表示されます。ファイルがないかTTLが期限切れの場合 — HTTPリクエストが実行されます。
DefaultCacheManagerは、emptyCache()(完全クリーンアップ)、cleanCache()(期限切れのみ削除)、およびカスタム日付によるclearCacheWithAge()メソッドを提供します。ImageCacheはメモリプレッシャー時に自動的に、またはimageCache.clear()で手動でクリアされます。
CachedNetworkImageは、標準のFlutterウィジェット構成に基づいて構築されています。内部実装では、非同期読み込みにImageProvider、ライフサイクル管理にStatefulWidgetを使用しています。
imageUrl — 必須パラメーター、画像のURL(StringまたはUri)。placeholder — 読み込み中に表示されるウィジェット。errorWidget — 読み込みエラー時のウィジェット。progressIndicatorBuilder — コンテキスト、URL、totalSizeおよびdownloadedSizeフィールドを持つDownloadProgressを受け取るビルダー。
CachedNetworkImageProvider — ダウンロードとキャッシュを管理するCachedNetworkStreamImageを返すImageProviderの実装です。このプロバイダーはFlutterのImageCacheと統合され、スケーリング、センタリング、繰り返しなど、すべての標準ImageProvider機能をサポートします。
flutter_cache_managerは、CachedNetworkImageのキャッシュの基盤となるライブラリです。設定済みのSQLiteデータベース、TTL、ファイル制限を持つDefaultCacheManagerを提供します。必要に応じて、独自のパラメーターを持つカスタムCacheManagerを作成できます。
| パラメーター | 説明 | デフォルト値 |
|---|---|---|
| maxAgeCacheObject | ファイルの最大保存期間 | 7日 |
| maxNrOfCacheObjects | ファイルの最大数 | 200 |
| key | マネージャーの一意識別子 | “default” |
| repo | メタデータのストレージタイプ | CacheObjectRepository(SQLite) |
| fileService | ダウンロード用HTTPクライアント | HttpFileService |
カスタムCacheManagerは、メソッドオーバーライドを使用してCacheManagerから継承することで作成されます。これは、画像を別のディレクトリに保存する必要がある場合や、異なるHTTPクライアントが必要な場合に便利です。マネージャーインスタンスはCachedNetworkImageのcacheManagerパラメーターに渡されます。
DefaultCacheManagerのSQLiteデータベースは、アプリケーションのtemporaryDirectoryの`{key}/CacheObjects.db`パスにあります。cacheObjectsテーブルには、key(URL)、relativePath、url、creationDate、eTag、httpHeadersのフィールドが含まれています。期限切れエントリーのクリーンアップ時には、maxAgeCacheObjectの条件に基づくSQLクエリが使用されます。
CachedNetworkImageは、CachedNetworkImageウィジェットとカスタムシナリオ向けのCachedNetworkImageProviderという2つの主要な読み込みアプローチを提供します。
CachedNetworkImage — 主要なアプローチです。imageUrlとplaceholderを渡すだけで、ウィジェットは自動的に読み込み完了までプレースホルダーを表示し、その後画像に置き換えます。
CachedNetworkImage(
imageUrl: "https://example.com/photo.jpg",
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
width: 200,
height: 200,
fit: BoxFit.cover,
)
placeholderとerrorWidgetは、コンテキスト、URL、(errorWidgetの場合は)エラーオブジェクトを受け取るビルダー関数です。このアプローチにより、URLやエラータイプに応じて異なるプレースホルダーを表示できます。
progressIndicatorBuilder — ダウンロードの進行状況をパーセンテージで表示できるパラメーターです。DownloadProgressにはtotalSize(不明な場合は-1)とdownloadedSizeが含まれます。
CachedNetworkImage(
imageUrl: "https://example.com/large.jpg",
progressIndicatorBuilder: (context, url, downloadProgress) {
return Center(
child: SizedBox(
width: 50,
height: 50,
child: Stack(
alignment: Alignment.center,
children: [
CircularProgressIndicator(
value: downloadProgress.progress,
),
Text(
"\(downloadProgress.downloadedSize ~/ 1024) KB",
),
],
),
),
};
},
imageBuilder: (context, imageProvider) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
image: DecorationImage(
image: imageProvider,
fit: BoxFit.cover,
),
),
};
},
)
imageBuilder — 画像表示をカスタマイズできるオプションのパラメーターです:角丸、影、装飾を追加できます。この例では、角丸にBorderRadiusを使用したDecorationImageを使用しています。
CachedNetworkImageProvider — CachedNetworkImageウィジェットを使用せずにImageまたはDecorationImageのためのプロバイダーです。BoxDecoration、FadeInImage、またはカスタムImageウィジェットを扱う際に便利です。
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
CachedNetworkImageのimageBuilderパラメーターを使用すると、標準のImageウィジェットをカスタム実装でオーバーライドできます。Imageを直接表示する代わりに、デコレーション付きのContainer、クリッピング用のClipRRect、またはリップル効果用のInk.imageを使用できます。imageBuilderはコンテキストと準備完了画像のImageProviderを受け取り、レンダリングを完全に制御できます。
追加パラメーター:memCacheWidthとmemCacheHeightはRAM内のキャッシュ画像サイズを制限し、FlutterのImageCacheの負荷を軽減します。cacheKeyを使用すると、URLの代わりにカスタムキャッシュキーを設定できます。これはURLに認証トークンを含む画像(クエリパラメーターはリクエストごとに変わりますが、コンテンツは同じまま)に便利です。
標準のImage.networkウィジェットは、ディスクに保存せずにウィジェットの再構築ごとに画像を読み込みます。CachedNetworkImageはファイルキャッシュ、プログレスインジケーター、エラーハンドリングを追加しますが、flutter_cache_managerとSQLiteへの依存が追加されます。
| 基準 | Image.network | CachedNetworkImage |
|---|---|---|
| ディスクキャッシュ | なし(Flutterメモリキャッシュのみ) | あり(SQLite+ファイル) |
| プログレス | なし | progressIndicatorBuilder |
| エラーウィジェット | デバッグ時のみ赤いプレースホルダー | カスタムerrorWidget |
| キャッシュTTL | 該当なし | 設定可能(デフォルト7日) |
| 依存関係 | なし(Flutterに組み込み) | cached_network_image + flutter_cache_manager + sqflite |
| オフラインアクセス | なし | あり(以前に読み込んだファイルの場合) |
| ビルドサイズ | 0 KB追加 | 約300 KB追加 |
オフライン機能と帯域幅の節約が重要なプロジェクトでは、CachedNetworkImageが明確な選択です。単発のシンプルな画面(オンボーディングやスプラッシュなど)の場合、Image.networkは追加の依存関係を必要としません。
CachedNetworkImageは標準のpub.dev依存関係として追加されます。インストール後、ウィジェットはすぐに使用できます。flutter_cache_managerは推移的依存関係として含まれます。
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
デフォルトでは、DefaultCacheManagerが設定(TTL = 7日、最大200ファイル)で使用されます。グローバルパラメーターを変更するには、Configを使用してカスタムCacheManagerインスタンスを作成し、maxAgeCacheObject、maxNrOfCacheObjects、repoをオーバーライドします。
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
final customCacheManager = CacheManager(
Config(
"custom_images",
stalePeriod: Duration(days: 14),
maxNrOfCacheObjects: 500,
repo: JsonCacheInfoRepository(
databaseName: "custom_images_cache.db",
),
),
);
// カスタムマネージャーの使用:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytesとmaxHeightBytes — キャッシュファイルのサイズを制限するためのオプションのパラメーターです。元の画像が必要な画面サイズより大きい場合、ディスク容量を節約するのに役立ちます。
よくある質問
CachedNetworkImageは、自動ディスクキャッシュによりネットワーク画像を読み込むためのFlutterウィジェットです。帯域幅の節約、オフラインモードでの動作、ダウンロード進捗の表示のために必要であり、標準のImage.networkではこれらが提供されません。
pubspec.yamlのdependenciesセクションにcached_network_image: ^3.4.1を追加し、flutter pub getを実行します。その後、ファイルにパッケージをインポートします:import 'package:cached_network_image/cached_network_image.dart'.
stalePeriodパラメーターをDurationとして指定したConfigを使用してカスタムCacheManagerを作成します。作成したマネージャーをCachedNetworkImageウィジェットのcacheManagerパラメーターに渡します。デフォルトでは、ファイルは7日間保存されます。
すべてのファイルを完全にクリーンアップするにはDefaultCacheManager().emptyCache()を呼び出します。期限切れのファイルのみを削除するにはcleanCache()を使用します。カスタムマネージャーはそのインスタンスでemptyCacheを呼び出してクリアします。
はい、CachedNetworkImageはAndroid、iOS、Web、macOS、Windows、Linuxをサポートしています。統一されたAPIによりすべてのプラットフォームで一貫した動作が保証され、キャッシュは各OSに適応したflutter_cache_managerを介して機能します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。