CachedNetworkImage adalah widget Flutter untuk memuat dan menyimpan cache gambar dari jaringan dengan dukungan untuk kemajuan, placeholder dan penanganan kesalahan. Menurut halaman resmi paket, perpustakaan ini didasarkan pada flutter_cache_manager dan menyediakan caching otomatis di disk dengan TTL yang dapat dikonfigurasi. CachedNetworkImage adalah solusi standar untuk memuat gambar dengan caching di aplikasi Flutter.
Poin Utama
CachedNetworkImage adalah widget Flutter dari paket pub.dev dengan nama yang sama, yang menyediakan pemuatan gambar dari jaringan dengan caching otomatis. Ini adalah lapisan di atas Image.network standar, menambahkan caching file, indikator kemajuan dan penanganan kesalahan kustom.
Secara internal, CachedNetworkImage menggunakan flutter_cache_manager — manajer cache dengan database SQLite untuk melacak file. Pada permintaan pertama, gambar diunduh dari jaringan, disimpan di disk, dan pada permintaan berikutnya disediakan dari cache dengan mempertimbangkan TTL (standar 7 hari). Cache in-memory dikelola oleh ImageCache standar Flutter.
Paket ini memiliki lebih dari 4.000 suka di pub.dev dan digunakan di ribuan proyek Flutter. CachedNetworkImage mendukung semua platform Flutter: Android, iOS, Web, macOS, Windows dan Linux. Berkat API yang seragam, pengembang mendapatkan pemuatan gambar lintas platform tanpa kode khusus platform.
Flutter menggunakan sistem caching dua tingkat: ImageCache (memori) dan flutter_cache_manager (disk + SQLite). ImageCache adalah cache global dari gambar yang didekode dengan batas jumlah (standar 1000) dan ukuran (standar 100 MB). flutter_cache_manager mengelola file di disk dan metadatanya.
Ketika CachedNetworkImage menerima permintaan gambar, pertama-tama ia memeriksa ImageCache Flutter — jika gambar sudah didekode di memori, gambar ditampilkan seketika. Jika tidak ditemukan, disk diperiksa melalui flutter_cache_manager: kueri SQLite memeriksa apakah file ada di cache dan apakah TTL-nya belum kedaluwarsa. Jika file masih berlaku — file dibaca dari disk, didekode dan ditampilkan. Jika file tidak ada atau TTL kedaluwarsa — permintaan HTTP dilakukan.
DefaultCacheManager menyediakan metode emptyCache() (pembersihan total), cleanCache() (hapus hanya yang kedaluwarsa) dan clearCacheWithAge() dengan tanggal kustom. ImageCache dibersihkan secara otomatis saat tekanan memori atau secara manual melalui imageCache.clear().
CachedNetworkImage dibangun di atas komposisi widget Flutter standar. Implementasi internal menggunakan ImageProvider untuk pemuatan asinkron dan StatefulWidget untuk melacak siklus hidup.
imageUrl — parameter wajib, URL gambar (String atau Uri). placeholder — widget yang ditampilkan selama pemuatan. errorWidget — widget saat kesalahan pemuatan. progressIndicatorBuilder — builder yang menerima konteks, URL dan DownloadProgress dengan bidang totalSize dan downloadedSize.
CachedNetworkImageProvider — implementasi ImageProvider yang mengembalikan CachedNetworkStreamImage, yang mengelola pengunduhan dan caching. Provider ini terintegrasi dengan ImageCache Flutter dan mendukung semua kemampuan ImageProvider standar: penskalaan, pemusatan dan pengulangan.
flutter_cache_manager — perpustakaan yang mendasari caching CachedNetworkImage. Ini menyediakan DefaultCacheManager dengan database SQLite yang dikonfigurasi, TTL dan batas file. Jika perlu, CacheManager kustom dengan parameter unik dapat dibuat.
| Parameter | Deskripsi | Nilai Standar |
|---|---|---|
| maxAgeCacheObject | Masa penyimpanan maksimum file | 7 hari |
| maxNrOfCacheObjects | Jumlah maksimum file | 200 |
| key | Pengidentifikasi unik manajer | “default” |
| repo | Jenis penyimpanan metadata | CacheObjectRepository (SQLite) |
| fileService | Klien HTTP untuk pengunduhan | HttpFileService |
CacheManager kustom dibuat dengan mewarisi CacheManager dan menimpa metode. Ini berguna ketika perlu menyimpan gambar di direktori terpisah atau menggunakan klien HTTP yang berbeda. Kemudian instance manajer diteruskan ke parameter cacheManager CachedNetworkImage.
Database SQLite DefaultCacheManager terletak di direktori temporaryDirectory aplikasi di jalur `{key}/CacheObjects.db`. Ini berisi tabel cacheObjects dengan bidang key (URL), relativePath, url, creationDate, eTag, httpHeaders. Saat membersihkan catatan kedaluwarsa, kueri SQL digunakan dengan kondisi berdasarkan maxAgeCacheObject.
CachedNetworkImage menyediakan dua cara utama pemuatan: widget CachedNetworkImage dan provider CachedNetworkImageProvider untuk skenario kustom.
CachedNetworkImage — cara utama. Cukup dengan memberikan imageUrl dan placeholder. Widget secara otomatis menampilkan placeholder hingga pemuatan selesai dan menggantinya dengan gambar.
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 dan errorWidget adalah fungsi builder yang menerima konteks, URL dan (untuk errorWidget) objek kesalahan. Pendekatan ini memungkinkan menampilkan cadangan yang berbeda tergantung pada URL atau jenis kesalahan.
progressIndicatorBuilder — parameter yang memungkinkan menampilkan persentase kemajuan pemuatan. DownloadProgress berisi totalSize (bisa -1 jika ukuran tidak diketahui) dan 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 — parameter opsional yang memungkinkan menyesuaikan tampilan gambar: menambahkan pembulatan, bayangan, dekorasi. Dalam contoh, DecorationImage dengan BorderRadius digunakan untuk sudut membulat.
CachedNetworkImageProvider — provider untuk Image atau DecorationImage tanpa menggunakan widget CachedNetworkImage. Berguna saat bekerja dengan BoxDecoration, FadeInImage atau widget Image kustom.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
Parameter imageBuilder di CachedNetworkImage memungkinkan mengganti widget Image standar dengan implementasi kustom. Alih-alih menampilkan Image secara langsung, dapat menggunakan Container dengan dekorasi, ClipRRect dengan pemotongan atau Ink.image untuk efek ripple. imageBuilder menerima konteks dan ImageProvider dari gambar yang siap, memberikan kontrol penuh atas rendering.
Parameter tambahan: memCacheWidth dan memCacheHeight membatasi ukuran gambar yang di-cache di memori RAM, mengurangi beban pada ImageCache Flutter. cacheKey memungkinkan mengatur kunci cache kustom sebagai pengganti URL, berguna untuk gambar dengan token otorisasi di URL (parameter kueri berubah setiap kali, tetapi konten tetap sama).
Widget standar Image.network memuat gambar setiap kali widget dibangun ulang tanpa menyimpannya di disk. CachedNetworkImage menambahkan caching file, kemajuan dan penanganan kesalahan, tetapi menambahkan ketergantungan pada flutter_cache_manager dan SQLite.
| Kriteria | Image.network | CachedNetworkImage |
|---|---|---|
| Cache di disk | Tidak (hanya cache memori Flutter) | Ya (SQLite + file) |
| Kemajuan | Tidak | progressIndicatorBuilder |
| Widget kesalahan | Hanya placeholder merah di debug | errorWidget kustom |
| TTL cache | Tidak berlaku | Dapat dikonfigurasi (standar 7 hari) |
| Ketergantungan | Tidak (tertanam di Flutter) | cached_network_image + flutter_cache_manager + sqflite |
| Akses offline | Tidak | Ya (dengan file yang diunduh sebelumnya) |
| Ukuran build | 0 KB tambahan | ~300 KB tambahan |
Untuk proyek di mana pekerjaan offline dan penghematan bandwidth penting, CachedNetworkImage adalah pilihan yang jelas. Untuk layar sederhana sekali pakai (misalnya, onboarding atau splash), Image.network tidak memerlukan ketergantungan tambahan.
CachedNetworkImage ditambahkan sebagai ketergantungan pub.dev standar. Setelah instalasi, widget siap digunakan. flutter_cache_manager masuk sebagai ketergantungan transitif.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Secara default, DefaultCacheManager digunakan dengan pengaturan: TTL = 7 hari, maks 200 file. Untuk mengubah parameter global, instance CacheManager kustom dengan Config dibuat, di mana maxAgeCacheObject, maxNrOfCacheObjects dan repo ditimpa.
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",
),
),
);
// Menggunakan manajer kustom:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes dan maxHeightBytes — parameter opsional untuk membatasi ukuran file yang di-cache. Ini berguna untuk menghemat ruang disk ketika gambar asli lebih besar dari ukuran layar yang diperlukan.
Pertanyaan yang Sering Diajukan
CachedNetworkImage — widget Flutter untuk memuat gambar dari jaringan dengan caching otomatis di disk. Digunakan untuk menghemat bandwidth, bekerja dalam mode offline dan menampilkan kemajuan pemuatan, yang tidak ada di Image.network standar.
Tambahkan cached_network_image: ^3.4.1 di bagian dependencies file pubspec.yaml dan jalankan flutter pub get. Kemudian impor paket di file: import 'package:cached_network_image/cached_network_image.dart'.
Buat CacheManager kustom dengan Config, di mana parameter stalePeriod ditentukan sebagai Duration. Berikan manajer yang dibuat ke parameter cacheManager widget CachedNetworkImage. Secara default file disimpan selama 7 hari.
Panggil DefaultCacheManager().emptyCache() untuk pembersihan total semua file. Untuk membersihkan hanya yang kedaluwarsa, gunakan cleanCache(). Manajer kustom dibersihkan dengan memanggil emptyCache pada instancenya.
Ya, CachedNetworkImage mendukung Android, iOS, Web, macOS, Windows dan Linux. API seragam memastikan perilaku yang sama di semua platform, dan caching bekerja melalui flutter_cache_manager yang disesuaikan untuk setiap OS.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga