CachedNetworkImage è un widget Flutter per caricare e memorizzare nella cache immagini di rete con supporto per indicatori di progresso, placeholder e gestione degli errori. Secondo la pagina ufficiale del pacchetto, la libreria si basa su flutter_cache_manager e fornisce memorizzazione automatica nella cache su disco con TTL configurabile. CachedNetworkImage è la soluzione standard per caricare immagini nelle applicazioni Flutter con caching.
Punti chiave
CachedNetworkImage è un widget Flutter del pacchetto omonimo su pub.dev che fornisce il caricamento di immagini di rete con memorizzazione automatica nella cache. È un involucro attorno al Image.network standard, aggiungendo la cache su file, gli indicatori di progresso e la gestione personalizzata degli errori.
Internamente, CachedNetworkImage utilizza flutter_cache_manager — un gestore di cache con database SQLite per tracciare i file. Alla prima richiesta, l'immagine viene scaricata dalla rete, salvata su disco e, nelle richieste successive, viene servita dalla cache tenendo conto del TTL (default 7 giorni). La cache in memoria è gestita dall'ImageCache standard di Flutter.
Il pacchetto ha oltre 4.000 mi piace su pub.dev ed è utilizzato in migliaia di progetti Flutter. CachedNetworkImage supporta tutte le piattaforme Flutter: Android, iOS, Web, macOS, Windows e Linux. Grazie a un'API unificata, gli sviluppatori ottengono il caricamento di immagini multipiattaforma senza codice specifico per piattaforma.
Flutter utilizza un sistema di cache a due livelli: ImageCache (memoria) e flutter_cache_manager (disco + SQLite). ImageCache è una cache globale di immagini decodificate con limiti sul numero (default 1000) e sulla dimensione (default 100 MB). flutter_cache_manager gestisce i file su disco e i loro metadati.
Quando CachedNetworkImage riceve una richiesta di immagine, controlla prima l'ImageCache di Flutter — se l'immagine è già decodificata in memoria, viene visualizzata istantaneamente. In caso di mancata corrispondenza nella cache, il disco viene controllato tramite flutter_cache_manager: una query SQLite verifica se il file esiste nella cache e se il suo TTL è scaduto. Se il file è aggiornato — viene letto dal disco, decodificato e visualizzato. Se il file manca o il TTL è scaduto — viene effettuata una richiesta HTTP.
DefaultCacheManager fornisce i metodi emptyCache() (pulizia completa), cleanCache() (rimuovere solo quelli scaduti) e clearCacheWithAge() con una data personalizzata. ImageCache viene pulito automaticamente in caso di pressione della memoria o manualmente tramite imageCache.clear().
CachedNetworkImage è costruito sulla composizione di widget Flutter standard. L'implementazione interna utilizza ImageProvider per il caricamento asincrono e StatefulWidget per la gestione del ciclo di vita.
imageUrl — parametro obbligatorio, l'URL dell'immagine (String o Uri). placeholder — widget visualizzato durante il caricamento. errorWidget — widget in caso di errore di caricamento. progressIndicatorBuilder — builder che riceve contesto, URL e DownloadProgress con i campi totalSize e downloadedSize.
CachedNetworkImageProvider — un'implementazione di ImageProvider che restituisce CachedNetworkStreamImage, che gestisce il download e la memorizzazione nella cache. Il provider si integra con l'ImageCache di Flutter e supporta tutte le funzionalità standard di ImageProvider: ridimensionamento, centratura e ripetizione.
flutter_cache_manager è la libreria alla base del sistema di cache di CachedNetworkImage. Fornisce DefaultCacheManager con un database SQLite configurato, TTL e limite di file. Se necessario, è possibile creare un CacheManager personalizzato con parametri unici.
| Parametro | Descrizione | Valore predefinito |
|---|---|---|
| maxAgeCacheObject | Durata massima di conservazione del file | 7 giorni |
| maxNrOfCacheObjects | Numero massimo di file | 200 |
| key | Identificatore univoco del gestore | “default” |
| repo | Tipo di archivio dei metadati | CacheObjectRepository (SQLite) |
| fileService | Client HTTP per il download | HttpFileService |
Un CacheManager personalizzato viene creato ereditando da CacheManager con override dei metodi. Ciò è utile quando le immagini devono essere archiviate in una directory separata o è necessario un client HTTP diverso. L'istanza del gestore viene quindi passata al parametro cacheManager di CachedNetworkImage.
Il database SQLite di DefaultCacheManager si trova nel temporaryDirectory dell'applicazione al percorso `{key}/CacheObjects.db`. Contiene la tabella cacheObjects con i campi: key (URL), relativePath, url, creationDate, eTag, httpHeaders. Durante la pulizia delle voci scadute, viene utilizzata una query SQL con una condizione su maxAgeCacheObject.
CachedNetworkImage offre due approcci principali al caricamento: il widget CachedNetworkImage e CachedNetworkImageProvider per scenari personalizzati.
CachedNetworkImage — l'approccio principale. Basta passare imageUrl e placeholder. Il widget mostra automaticamente il placeholder fino al completamento del caricamento e lo sostituisce con l'immagine.
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 e errorWidget sono funzioni builder che accettano contesto, URL e (per errorWidget) un oggetto di errore. Questo approccio consente di mostrare placeholder diversi a seconda dell'URL o del tipo di errore.
progressIndicatorBuilder — un parametro che consente di visualizzare l'avanzamento del download in percentuale. DownloadProgress contiene totalSize (può essere -1 se sconosciuto) e 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 — un parametro opzionale che consente di personalizzare la visualizzazione dell'immagine: aggiungere angoli arrotondati, ombre, decorazioni. L'esempio utilizza DecorationImage con BorderRadius per angoli arrotondati.
CachedNetworkImageProvider — un provider per Image o DecorationImage senza utilizzare il widget CachedNetworkImage. Utile quando si lavora con BoxDecoration, FadeInImage o widget Image personalizzati.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
Il parametro imageBuilder in CachedNetworkImage consente di sovrascrivere il widget Image standard con un'implementazione personalizzata. Invece di visualizzare direttamente l'Image, puoi utilizzare un Container con decorazione, ClipRRect per il ritaglio o Ink.image per effetti ondulatori. imageBuilder riceve il contesto e l'ImageProvider dell'immagine pronta, dando il controllo completo sul rendering.
Parametri aggiuntivi: memCacheWidth e memCacheHeight limitano la dimensione dell'immagine memorizzata nella cache nella RAM, riducendo il carico sull'ImageCache di Flutter. cacheKey consente di impostare una chiave di cache personalizzata anziché l'URL, utile per immagini con token di autorizzazione nell'URL (i parametri di query cambiano a ogni richiesta ma il contenuto rimane lo stesso).
Il widget standard Image.network carica l'immagine a ogni ricostruzione del widget senza salvarla su disco. CachedNetworkImage aggiunge la cache su file, gli indicatori di progresso e la gestione degli errori, ma aggiunge una dipendenza da flutter_cache_manager e SQLite.
| Criterio | Image.network | CachedNetworkImage |
|---|---|---|
| Cache su disco | No (solo cache memoria Flutter) | Sì (SQLite + file) |
| Progresso | No | progressIndicatorBuilder |
| Widget di errore | Solo placeholder rosso in debug | errorWidget personalizzato |
| TTL cache | Non applicabile | Configurabile (7 giorni predefinito) |
| Dipendenze | Nessuna (integrato in Flutter) | cached_network_image + flutter_cache_manager + sqflite |
| Accesso offline | No | Sì (con file precedentemente caricati) |
| Dimensione build | 0 KB aggiuntivi | ~300 KB aggiuntivi |
Per i progetti in cui la capacità offline e il risparmio di larghezza di banda sono importanti, CachedNetworkImage è la scelta ovvia. Per schermate semplici e una tantum (ad esempio onboarding o splash), Image.network non richiede dipendenze aggiuntive.
CachedNetworkImage viene aggiunto come dipendenza standard di pub.dev. Dopo l'installazione, il widget è pronto all'uso. flutter_cache_manager è incluso come dipendenza transitiva.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Per impostazione predefinita, viene utilizzato DefaultCacheManager con le impostazioni: TTL = 7 giorni, max 200 file. Per modificare i parametri globali, viene creata un'istanza personalizzata di CacheManager con Config, dove maxAgeCacheObject, maxNrOfCacheObjects e repo vengono sovrascritti.
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",
),
),
);
// Utilizzo di un gestore personalizzato:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes e maxHeightBytes — parametri opzionali per limitare la dimensione del file nella cache. Ciò è utile per risparmiare spazio su disco quando l'immagine originale è più grande della dimensione dello schermo richiesta.
Domande frequenti
CachedNetworkImage è un widget Flutter per caricare immagini di rete con memorizzazione automatica nella cache su disco. Serve per risparmiare larghezza di banda, lavorare in modalità offline e visualizzare l'avanzamento del download, cose che il Image.network standard non offre.
Aggiungi cached_network_image: ^3.4.1 nella sezione dependencies del file pubspec.yaml ed esegui flutter pub get. Quindi importa il pacchetto nel tuo file: import 'package:cached_network_image/cached_network_image.dart'.
Crea un CacheManager personalizzato con Config dove il parametro stalePeriod viene specificato come Duration. Passa il gestore creato al parametro cacheManager del widget CachedNetworkImage. Per impostazione predefinita, i file vengono conservati per 7 giorni.
Chiama DefaultCacheManager().emptyCache() per una pulizia completa di tutti i file. Per rimuovere solo i file scaduti, usa cleanCache(). Un gestore personalizzato viene svuotato chiamando emptyCache sulla sua istanza.
Sì, CachedNetworkImage supporta Android, iOS, Web, macOS, Windows e Linux. Un'API unificata garantisce un comportamento coerente su tutte le piattaforme e la memorizzazione nella cache funziona tramite flutter_cache_manager, adattato per ciascun sistema operativo.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche