CachedNetworkImage je widget Flutter pro načítání a ukládání obrázků z sítě do mezipaměti s podporou průběhu, placeholderů a zpracování chyb. Podle oficiální stránky balíčku knihovna vychází z flutter_cache_manager a poskytuje automatické ukládání do mezipaměti na disk s konfigurovatelným TTL. CachedNetworkImage je standardní řešení pro načítání obrázků s mezipamětí v aplikacích Flutter.
Hlavní body
CachedNetworkImage je widget Flutter ze stejnojmenného balíčku pub.dev, který poskytuje načítání obrázků z sítě s automatickým ukládáním do mezipaměti. Je to vrstva nad standardním Image.network, přidávající ukládání do mezipaměti souborů, indikátory průběhu a vlastní zpracování chyb.
Interně CachedNetworkImage používá flutter_cache_manager — správce mezipaměti s databází SQLite pro sledování souborů. Při prvním požadavku je obrázek stažen z sítě, uložen na disk a při následujících požadavcích je doručen z mezipaměti s ohledem na TTL (ve výchozím nastavení 7 dní). In-memory mezipaměť je spravována standardním ImageCache Flutter.
Balíček má více než 4 000 lajků na pub.dev a používá se v tisících projektů Flutter. CachedNetworkImage podporuje všechny platformy Flutter: Android, iOS, Web, macOS, Windows a Linux. Díky jednotnému API získává vývojář multiplatformní načítání obrázků bez kódu specifického pro platformu.
Flutter používá dvouúrovňový systém ukládání do mezipaměti: ImageCache (paměť) a flutter_cache_manager (disk + SQLite). ImageCache je globální mezipaměť dekódovaných obrázků s limitem počtu (výchozí 1000) a velikosti (výchozí 100 MB). flutter_cache_manager spravuje soubory na disku a jejich metadata.
Když CachedNetworkImage obdrží požadavek na obrázek, nejprve zkontroluje ImageCache Flutter — pokud je obrázek již dekódován v paměti, zobrazí se okamžitě. Při neúspěchu je disk zkontrolován prostřednictvím flutter_cache_manager: dotaz SQLite zkontroluje, zda soubor existuje v mezipaměti a zda nevypršela jeho TTL. Pokud je soubor aktuální — je přečten z disku, dekódován a zobrazen. Pokud soubor neexistuje nebo TTL vypršelo — provede se HTTP požadavek.
DefaultCacheManager poskytuje metody emptyCache() (úplné vyčištění), cleanCache() (smazání pouze prošlých) a clearCacheWithAge() s vlastním datem. ImageCache se čistí automaticky při paměťovém tlaku nebo ručně prostřednictvím imageCache.clear().
CachedNetworkImage je postaven na kompozici standardních widgetů Flutter. Interní implementace používá ImageProvider pro asynchronní načítání a StatefulWidget pro sledování životního cyklu.
imageUrl — povinný parametr, URL obrázku (String nebo Uri). placeholder — widget zobrazený během načítání. errorWidget — widget při chybě načítání. progressIndicatorBuilder — builder přijímající kontext, URL a DownloadProgress s poli totalSize a downloadedSize.
CachedNetworkImageProvider — implementace ImageProvider vracející CachedNetworkStreamImage, který spravuje stahování a ukládání do mezipaměti. Poskytovatel se integruje s ImageCache Flutter a podporuje všechny možnosti standardního ImageProvider: škálování, centrování a opakování.
flutter_cache_manager — knihovna, která je základem ukládání do mezipaměti CachedNetworkImage. Poskytuje DefaultCacheManager s nakonfigurovanou databází SQLite, TTL a limitem souborů. V případě potřeby lze vytvořit vlastní CacheManager s jedinečnými parametry.
| Parametr | Popis | Výchozí hodnota |
|---|---|---|
| maxAgeCacheObject | Maximální doba uchovávání souboru | 7 dní |
| maxNrOfCacheObjects | Maximální počet souborů | 200 |
| key | Jedinečný identifikátor správce | „default“ |
| repo | Typ ukládání metadat | CacheObjectRepository (SQLite) |
| fileService | HTTP klient pro stahování | HttpFileService |
Vlastní CacheManager se vytváří děděním z CacheManager s přepsáním metod. To je užitečné, když je potřeba ukládat obrázky do samostatného adresáře nebo použít jiného HTTP klienta. Poté je instance správce předána parametru cacheManager v CachedNetworkImage.
Databáze SQLite DefaultCacheManager se nachází v adresáři aplikace temporaryDirectory v cestě `{key}/CacheObjects.db`. Obsahuje tabulku cacheObjects s poli key (URL), relativePath, url, creationDate, eTag, httpHeaders. Při čištění prošlých záznamů se používá SQL dotaz s podmínkou podle maxAgeCacheObject.
CachedNetworkImage poskytuje dva hlavní způsoby načítání: widget CachedNetworkImage a provider CachedNetworkImageProvider pro vlastní scénáře.
CachedNetworkImage — hlavní způsob. Stačí předat imageUrl a placeholder. Widget automaticky zobrazí placeholder do dokončení načítání a nahradí jej obrázkem.
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 a errorWidget jsou funkce builder přijímající kontext, URL a (pro errorWidget) objekt chyby. Tento přístup umožňuje zobrazovat různé náhrady v závislosti na URL nebo typu chyby.
progressIndicatorBuilder — parametr umožňující zobrazovat průběh načítání v procentech. DownloadProgress obsahuje totalSize (může být -1, pokud není velikost známa) a 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 — volitelný parametr umožňující přizpůsobení zobrazení obrázku: přidání zaoblení, stínu, dekorace. V příkladu se používá DecorationImage s BorderRadius pro zaoblené rohy.
CachedNetworkImageProvider — provider pro Image nebo DecorationImage bez použití widgetu CachedNetworkImage. Užitečný při práci s BoxDecoration, FadeInImage nebo vlastními widgety Image.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
Parametr imageBuilder v CachedNetworkImage umožňuje nahradit standardní widget Image vlastní implementací. Místo přímého zobrazení Image lze použít Container s dekorací, ClipRRect s oříznutím nebo Ink.image pro efekt vlnění. imageBuilder přijímá kontext a ImageProvider hotového obrázku a poskytuje plnou kontrolu nad vykreslováním.
Další parametry: memCacheWidth a memCacheHeight omezují velikost obrázku uloženého v mezipaměti v RAM, čímž snižují zatížení ImageCache Flutter. cacheKey umožňuje nastavit vlastní klíč mezipaměti namísto URL, což je užitečné pro obrázky s autorizačními tokeny v URL (parametry dotazu se mění při každém požadavku, ale obsah zůstává stejný).
Standardní widget Image.network načítá obrázek při každém přestavění widgetu bez ukládání na disk. CachedNetworkImage přidává ukládání do mezipaměti souborů, průběh a zpracování chyb, ale přidává závislost na flutter_cache_manager a SQLite.
| Kritérium | Image.network | CachedNetworkImage |
|---|---|---|
| Mezipaměť na disku | Ne (pouze paměťová mezipaměť Flutter) | Ano (SQLite + soubory) |
| Průběh | Ne | progressIndicatorBuilder |
| Error widget | Pouze červený placeholder v debug | Vlastní errorWidget |
| TTL mezipaměti | Nelze použít | Konfigurovatelný (výchozí 7 dní) |
| Závislosti | Ne (vestavěno ve Flutter) | cached_network_image + flutter_cache_manager + sqflite |
| Offline přístup | Ne | Ano (při dříve stažených souborech) |
| Velikost sestavení | 0 KB navíc | ~300 KB navíc |
Pro projekty, kde je důležitá offline práce a úspora přenosu dat, je CachedNetworkImage jednoznačnou volbou. Pro jednoduché jednorázové obrazovky (např. onboarding nebo splash) Image.network nevyžaduje další závislosti.
CachedNetworkImage se přidává jako standardní závislost pub.dev. Po instalaci je widget připraven k použití. flutter_cache_manager vstupuje jako tranzitivní závislost.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Ve výchozím nastavení se používá DefaultCacheManager s nastavením: TTL = 7 dní, max 200 souborů. Pro změnu globálních parametrů se vytvoří vlastní instance CacheManager s Config, kde se přepíší maxAgeCacheObject, maxNrOfCacheObjects a 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",
),
),
);
// Použití vlastního správce:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes a maxHeightBytes — volitelné parametry pro omezení velikosti souboru v mezipaměti. To je užitečné pro úsporu místa na disku, když je původní obrázek větší než požadovaná velikost obrazovky.
Často kladené otázky
CachedNetworkImage — widget Flutter pro načítání obrázků z sítě s automatickým ukládáním do mezipaměti na disk. Slouží k úspoře přenosu dat, práci v offline režimu a zobrazení průběhu načítání, což standardní Image.network postrádá.
Přidejte cached_network_image: ^3.4.1 do sekce dependencies souboru pubspec.yaml a spusťte flutter pub get. Poté importujte balíček v souboru: import 'package:cached_network_image/cached_network_image.dart'.
Vytvořte vlastní CacheManager s Config, kde je parametr stalePeriod uveden jako Duration. Vytvořeného správce předejte parametru cacheManager widgetu CachedNetworkImage. Ve výchozím nastavení se soubory uchovávají 7 dní.
Zavolejte DefaultCacheManager().emptyCache() pro úplné vyčištění všech souborů. Pro vyčištění pouze prošlých použijte cleanCache(). Vlastní správce se čistí voláním emptyCache na jeho instanci.
Ano, CachedNetworkImage podporuje Android, iOS, Web, macOS, Windows a Linux. Jednotné API zajišťuje stejné chování na všech platformách a ukládání do mezipaměti funguje prostřednictvím flutter_cache_manager přizpůsobeného každému OS.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také