A CachedNetworkImage egy Flutter widget képek hálózatról történő betöltésére és gyorsítótárazására, támogatva a folyamatjelzést, helyőrzőket és hibakezelést. A csomag hivatalos oldala szerint a könyvtár a flutter_cache_manager-en alapul, és automatikus lemezes gyorsítótárazást biztosít konfigurálható TTL-lel. A CachedNetworkImage a szabványos megoldás képek gyorsítótárazott betöltésére Flutter alkalmazásokban.
Főbb pontok
CachedNetworkImage egy Flutter widget az azonos nevű pub.dev csomagból, amely automatikus gyorsítótárazással teszi lehetővé képek betöltését a hálózatról. Ez egy réteg a szabványos Image.network felett, fájlgyorsítótárazást, folyamatjelzőket és egyéni hibakezelést hozzáadva.
Belsőleg a CachedNetworkImage a flutter_cache_manager-t használja — egy gyorsítótár-kezelőt SQLite adatbázissal a fájlok nyomon követéséhez. Az első kérésnél a kép letöltődik a hálózatról, elmentődik a lemezre, és a következő kéréseknél a gyorsítótárból kerül elő a TTL (alapértelmezetten 7 nap) figyelembevételével. A memóriabeli gyorsítótárat a Flutter szabványos ImageCache-je kezeli.
A csomagnak több mint 4 000 kedvelése van a pub.dev-en, és több ezer Flutter projektben használják. A CachedNetworkImage támogatja az összes Flutter platformot: Android, iOS, Web, macOS, Windows és Linux. Az egységes API-nak köszönhetően a fejlesztő platformfüggetlen képbetöltést kap platform-specifikus kód nélkül.
A Flutter kétszintű gyorsítótárazási rendszert használ: ImageCache (memória) és flutter_cache_manager (lemez + SQLite). Az ImageCache a dekódolt képek globális gyorsítótára számbeli (alapértelmezetten 1000) és méretbeli (alapértelmezetten 100 MB) korláttal. A flutter_cache_manager a lemezen lévő fájlokat és azok metaadatait kezeli.
Amikor a CachedNetworkImage képkérést kap, először a Flutter ImageCache-ét ellenőrzi — ha a kép már dekódolva van a memóriában, azonnal megjelenik. Hiány esetén a lemez ellenőrzésre kerül a flutter_cache_manager-en keresztül: egy SQLite lekérdezés ellenőrzi, hogy a fájl létezik-e a gyorsítótárban és nem járt-e le a TTL-je. Ha a fájl aktuális — lemezről olvasásra kerül, dekódolódik és megjelenik. Ha a fájl nem létezik vagy a TTL lejárt — HTTP kérés kerül végrehajtásra.
DefaultCacheManager metódusokat biztosít: emptyCache() (teljes ürítés), cleanCache() (csak a lejártak törlése) és clearCacheWithAge() egyéni dátummal. Az ImageCache automatikusan ürül memórianyomás esetén, vagy manuálisan az imageCache.clear() segítségével.
A CachedNetworkImage szabványos Flutter widgetek kompozíciójára épül. A belső implementáció ImageProvider-t használ az aszinkron betöltéshez és StatefulWidget-et az életciklus követéséhez.
imageUrl — kötelező paraméter, a kép URL-je (String vagy Uri). placeholder — a betöltés alatt megjelenített widget. errorWidget — widget betöltési hiba esetén. progressIndicatorBuilder — builder, amely context-et, URL-t és DownloadProgress-et kap a totalSize és downloadedSize mezőkkel.
CachedNetworkImageProvider — az ImageProvider implementációja, amely CachedNetworkStreamImage-ot ad vissza, kezelve a letöltést és gyorsítótárazást. A provider integrálódik a Flutter ImageCache-szel, és támogatja a szabványos ImageProvider összes képességét: méretezést, középre igazítást és ismétlést.
flutter_cache_manager — a CachedNetworkImage gyorsítótárazásának alapjául szolgáló könyvtár. DefaultCacheManager-t biztosít konfigurált SQLite adatbázissal, TTL-lel és fájlkorláttal. Szükség esetén egyéni CacheManager hozható létre egyedi paraméterekkel.
| Paraméter | Leírás | Alapértelmezett érték |
|---|---|---|
| maxAgeCacheObject | Fájl maximális tárolási ideje | 7 nap |
| maxNrOfCacheObjects | Maximális fájlok száma | 200 |
| key | Kezelő egyedi azonosítója | „default“ |
| repo | Metaadatok tárolásának típusa | CacheObjectRepository (SQLite) |
| fileService | HTTP kliens a letöltéshez | HttpFileService |
Egyéni CacheManager a CacheManager-ből való örökléssel és metódusok felülírásával hozható létre. Ez akkor hasznos, ha a képeket külön könyvtárban kell tárolni vagy más HTTP klienst kell használni. Ezután a kezelő példánya átadásra kerül a CachedNetworkImage cacheManager paraméterének.
A DefaultCacheManager SQLite adatbázisa az alkalmazás temporaryDirectory könyvtárában található a `{key}/CacheObjects.db` útvonalon. Tartalmazza a cacheObjects táblát key (URL), relativePath, url, creationDate, eTag, httpHeaders mezőkkel. A lejárt rekordok törlésekor SQL lekérdezés használatos a maxAgeCacheObject szerinti feltétellel.
A CachedNetworkImage két fő betöltési módot kínál: a CachedNetworkImage widgetet és a CachedNetworkImageProvider-t egyéni forgatókönyvekhez.
CachedNetworkImage — a fő mód. Elég megadni az imageUrl-t és a placeholder-t. A widget automatikusan megjeleníti a helyőrzőt a betöltés befejezéséig, majd lecseréli a képre.
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,
)
A placeholder és errorWidget builder függvények, amelyek context-et, URL-t és (az errorWidget esetén) hibaobjektumot kapnak. Ez a megközelítés lehetővé teszi különböző helyettesítők megjelenítését az URL-től vagy a hiba típusától függően.
progressIndicatorBuilder — paraméter, amely lehetővé teszi a betöltési folyamat százalékos megjelenítését. A DownloadProgress tartalmazza a totalSize-t (lehet -1, ha a méret ismeretlen) és a downloadedSize-t.
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 — opcionális paraméter, amely lehetővé teszi a kép megjelenítésének testreszabását: lekerekítés, árnyék, dekoráció hozzáadása. A példában DecorationImage van használatban BorderRadius-szal a lekerekített sarkokhoz.
CachedNetworkImageProvider — provider Image vagy DecorationImage számára a CachedNetworkImage widget használata nélkül. Hasznos BoxDecoration, FadeInImage vagy egyéni Image widgetekkel való munkánál.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
A imageBuilder paraméter a CachedNetworkImage-ben lehetővé teszi a szabványos Image widget egyéni implementációra cserélését. A közvetlen Image megjelenítés helyett használható Container dekorációval, ClipRRect vágással vagy Ink.image hullám effekthez. Az imageBuilder megkapja a kész kép context-jét és ImageProvider-jét, teljes kontrollt adva a renderelés felett.
További paraméterek: memCacheWidth és memCacheHeight korlátozzák a gyorsítótárazott kép méretét a RAM-ban, csökkentve a Flutter ImageCache terhelését. A cacheKey lehetővé teszi egyéni gyorsítótár-kulcs beállítását az URL helyett, ami hasznos az URL-ben hitelesítési tokeneket tartalmazó képeknél (a lekérdezési paraméterek minden kérésnél változnak, de a tartalom ugyanaz marad).
A szabványos Image.network widget minden widget-újraépítéskor betölti a képet anélkül, hogy lemezre mentené. A CachedNetworkImage fájlgyorsítótárazást, folyamatjelzést és hibakezelést ad hozzá, de függőséget hoz létre a flutter_cache_manager és SQLite iránt.
| Szempont | Image.network | CachedNetworkImage |
|---|---|---|
| Lemezes gyorsítótár | Nem (csak Flutter memória gyorsítótár) | Igen (SQLite + fájlok) |
| Folyamatjelzés | Nem | progressIndicatorBuilder |
| Hiba widget | Csak piros helyőrző debug módban | Egyéni errorWidget |
| Gyorsítótár TTL | Nem alkalmazható | Konfigurálható (alapértelmezetten 7 nap) |
| Függőségek | Nincs (Flutter-be építve) | cached_network_image + flutter_cache_manager + sqflite |
| Offline hozzáférés | Nem | Igen (korábban letöltött fájlokkal) |
| Build méret | 0 KB többlet | ~300 KB többlet |
Azoknál a projekteknél, ahol fontos az offline munka és a sávszélesség megtakarítás, a CachedNetworkImage egyértelmű választás. Egyszerű egyszeri képernyőknél (pl. onboarding vagy splash) az Image.network nem igényel további függőségeket.
A CachedNetworkImage szabványos pub.dev függőségként kerül hozzáadásra. Telepítés után a widget használatra kész. A flutter_cache_manager tranzitív függőségként kerül be.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Alapértelmezetten a DefaultCacheManager kerül használatra a következő beállításokkal: TTL = 7 nap, max 200 fájl. A globális paraméterek módosításához egy egyéni CacheManager példány jön létre Config-gal, ahol a maxAgeCacheObject, maxNrOfCacheObjects és repo felülírásra kerül.
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",
),
),
);
// Egyéni kezelő használata:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes és maxHeightBytes — opcionális paraméterek a gyorsítótárazott fájl méretének korlátozására. Ez hasznos a lemezterület megtakarításához, ha az eredeti kép nagyobb a szükséges képernyőméretnél.
Gyakran Ismételt Kérdések
CachedNetworkImage — Flutter widget képek hálózatról történő betöltésére automatikus lemezes gyorsítótárazással. Sávszélesség megtakarítására, offline módban való munkára és betöltési folyamat megjelenítésére használják, ami a szabványos Image.network-ből hiányzik.
Adja hozzá a cached_network_image: ^3.4.1 sort a pubspec.yaml fájl dependencies szakaszához, és futtassa a flutter pub get parancsot. Ezután importálja a csomagot a fájlban: import 'package:cached_network_image/cached_network_image.dart'.
Hozzon létre egy egyéni CacheManager-t Config-gal, ahol a stalePeriod paraméter Duration-ként van megadva. Adja át a létrehozott kezelőt a CachedNetworkImage widget cacheManager paraméterének. Alapértelmezetten a fájlok 7 napig tárolódnak.
Hívja a DefaultCacheManager().emptyCache() metódust az összes fájl teljes törléséhez. Csak a lejárt fájlok törléséhez használja a cleanCache() metódust. Az egyéni kezelő a példányán lévő emptyCache hívással üríthető.
Igen, a CachedNetworkImage támogatja az Android, iOS, Web, macOS, Windows és Linux platformokat. Az egységes API azonos viselkedést biztosít minden platformon, a gyorsítótárazás pedig a minden operációs rendszerhez igazított flutter_cache_manager-en keresztül működik.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is