Ang CachedNetworkImage ay isang Flutter widget para sa pag-load at pag-cache ng mga larawan mula sa network na may suporta para sa progreso, placeholder at paghawak ng error. Ayon sa opisyal na pahina ng package, ang library ay batay sa flutter_cache_manager at nagbibigay ng awtomatikong caching sa disk na may configurable na TTL. CachedNetworkImage ay ang karaniwang solusyon para sa pag-load ng mga larawan na may caching sa mga Flutter application.
Mga Pangunahing Punto
CachedNetworkImage ay isang Flutter widget mula sa parehong pangalan ng pub.dev package na nagbibigay ng pag-load ng mga larawan mula sa network na may awtomatikong caching. Ito ay isang layer sa ibabaw ng karaniwang Image.network, nagdadagdag ng file caching, mga indicator ng progreso at custom na paghawak ng error.
Sa loob, ang CachedNetworkImage ay gumagamit ng flutter_cache_manager — isang cache manager na may SQLite database para sa pagsubaybay ng mga file. Sa unang request, ang larawan ay nadi-download mula sa network, nai-save sa disk, at sa mga susunod na request ay ibinibigay mula sa cache na isinasaalang-alang ang TTL (default 7 araw). Ang in-memory cache ay pinamamahalaan ng karaniwang ImageCache ng Flutter.
Ang package ay may higit sa 4,000 likes sa pub.dev at ginagamit sa libu-libong Flutter projects. Sinusuportahan ng CachedNetworkImage ang lahat ng Flutter platforms: Android, iOS, Web, macOS, Windows at Linux. Dahil sa pare-parehong API, ang developer ay nakakakuha ng cross-platform na pag-load ng larawan nang walang platform-specific na code.
Ang Flutter ay gumagamit ng dalawang antas na caching system: ImageCache (memorya) at flutter_cache_manager (disk + SQLite). Ang ImageCache ay isang global na cache ng mga decoded na larawan na may limitasyon sa bilang (default 1000) at laki (default 100 MB). Ang flutter_cache_manager ay namamahala ng mga file sa disk at ng kanilang metadata.
Kapag nakatanggap ang CachedNetworkImage ng request para sa larawan, una nitong sinusuri ang ImageCache ng Flutter — kung ang larawan ay naka-decode na sa memorya, ito ay agad na ipinapakita. Kung wala, ang disk ay sinusuri sa pamamagitan ng flutter_cache_manager: isang SQLite query ang nagsusuri kung ang file ay nasa cache at kung ang TTL nito ay hindi nag-expire. Kung ang file ay napapanahon — ito ay binabasa mula sa disk, dinedecode at ipinapakita. Kung ang file ay wala o ang TTL ay nag-expire — isang HTTP request ang isinasagawa.
Ang DefaultCacheManager ay nagbibigay ng mga method na emptyCache() (buong pag-clear), cleanCache() (pagtanggal lamang ng mga nag-expire) at clearCacheWithAge() na may custom na petsa. Ang ImageCache ay awtomatikong nag-clear sa memory pressure o manu-mano sa pamamagitan ng imageCache.clear().
Ang CachedNetworkImage ay binuo sa komposisyon ng mga karaniwang Flutter widgets. Ang internal na implementasyon ay gumagamit ng ImageProvider para sa asynchronous na pag-load at StatefulWidget para sa pagsubaybay ng lifecycle.
imageUrl — mandatoryong parameter, URL ng larawan (String o Uri). placeholder — widget na ipinapakita habang naglo-load. errorWidget — widget kapag may error sa pag-load. progressIndicatorBuilder — builder na tumatanggap ng context, URL at DownloadProgress na may mga field na totalSize at downloadedSize.
CachedNetworkImageProvider — implementasyon ng ImageProvider na nagbabalik ng CachedNetworkStreamImage, na namamahala sa pag-download at caching. Ang provider ay nagsasama sa ImageCache ng Flutter at sumusuporta sa lahat ng kakayahan ng karaniwang ImageProvider: pag-scale, pag-center at pag-ulit.
flutter_cache_manager — ang library na nasa ilalim ng caching ng CachedNetworkImage. Nagbibigay ito ng DefaultCacheManager na may configured na SQLite database, TTL at limitasyon ng file. Kung kinakailangan, maaaring gumawa ng custom na CacheManager na may natatanging mga parameter.
| Parameter | Deskripsyon | Default na Halaga |
|---|---|---|
| maxAgeCacheObject | Maximum na panahon ng pag-iimbak ng file | 7 araw |
| maxNrOfCacheObjects | Maximum na bilang ng mga file | 200 |
| key | Natatanging identifier ng manager | “default” |
| repo | Uri ng pag-iimbak ng metadata | CacheObjectRepository (SQLite) |
| fileService | HTTP client para sa pag-download | HttpFileService |
Ang custom na CacheManager ay ginagawa sa pamamagitan ng pagmana mula sa CacheManager na may pag-override ng mga method. Ito ay kapaki-pakinabang kapag kailangang mag-imbak ng mga larawan sa hiwalay na direktoryo o gumamit ng ibang HTTP client. Pagkatapos ang instance ng manager ay ipinapasa sa cacheManager parameter ng CachedNetworkImage.
Ang SQLite database ng DefaultCacheManager ay matatagpuan sa temporaryDirectory ng application sa path na `{key}/CacheObjects.db`. Naglalaman ito ng table na cacheObjects na may mga field na key (URL), relativePath, url, creationDate, eTag, httpHeaders. Kapag nag-clear ng mga nag-expire na record, ginagamit ang SQL query na may kondisyon batay sa maxAgeCacheObject.
Ang CachedNetworkImage ay nagbibigay ng dalawang pangunahing paraan ng pag-load: ang CachedNetworkImage widget at ang CachedNetworkImageProvider para sa mga custom na scenario.
CachedNetworkImage — ang pangunahing paraan. Sapat na ibigay ang imageUrl at placeholder. Awtomatikong ipinapakita ng widget ang placeholder hanggang sa matapos ang pag-load at pinapalitan ito ng larawan.
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,
)
Ang placeholder at errorWidget ay mga builder function na tumatanggap ng context, URL at (para sa errorWidget) error object. Ang approach na ito ay nagbibigay-daan sa pagpapakita ng iba't ibang kapalit depende sa URL o uri ng error.
progressIndicatorBuilder — parameter na nagbibigay-daan sa pagpapakita ng porsyento ng progreso ng pag-load. Ang DownloadProgress ay naglalaman ng totalSize (maaaring -1 kung hindi alam ang laki) at 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 — opsyonal na parameter na nagbibigay-daan sa pag-customize ng display ng larawan: pagdagdag ng rounding, anino, dekorasyon. Sa halimbawa, ginagamit ang DecorationImage na may BorderRadius para sa mga bilog na sulok.
CachedNetworkImageProvider — provider para sa Image o DecorationImage nang hindi ginagamit ang CachedNetworkImage widget. Kapaki-pakinabang kapag nagtatrabaho sa BoxDecoration, FadeInImage o custom na Image widgets.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
Ang parameter na imageBuilder sa CachedNetworkImage ay nagbibigay-daan sa pagpapalit ng karaniwang Image widget ng custom na implementasyon. Sa halip na direktang pagpapakita ng Image, maaaring gumamit ng Container na may dekorasyon, ClipRRect na may pagputol o Ink.image para sa ripple effect. Ang imageBuilder ay tumatanggap ng context at ImageProvider ng handa na larawan, na nagbibigay ng buong kontrol sa rendering.
Mga karagdagang parameter: memCacheWidth at memCacheHeight ay naglilimita sa laki ng naka-cache na larawan sa RAM, binabawasan ang load sa ImageCache ng Flutter. Ang cacheKey ay nagbibigay-daan sa pag-set ng custom na cache key sa halip na URL, kapaki-pakinabang para sa mga larawan na may authorization token sa URL (nagbabago ang query parameter sa bawat request, ngunit nananatiling pareho ang content).
Ang karaniwang widget na Image.network ay naglo-load ng larawan sa bawat rebuild ng widget nang hindi ito nai-save sa disk. Ang CachedNetworkImage ay nagdadagdag ng file caching, progreso at paghawak ng error, ngunit nagdadagdag ng dependency sa flutter_cache_manager at SQLite.
| Kriteria | Image.network | CachedNetworkImage |
|---|---|---|
| Cache sa disk | Hindi (memory cache lang ng Flutter) | Oo (SQLite + file) |
| Progreso | Hindi | progressIndicatorBuilder |
| Error widget | Pulang placeholder lang sa debug | Custom na errorWidget |
| TTL ng cache | Hindi applicable | Configurable (default 7 araw) |
| Mga dependency | Wala (naka-embed sa Flutter) | cached_network_image + flutter_cache_manager + sqflite |
| Offline access | Hindi | Oo (sa mga naunang nai-download na file) |
| Laki ng build | 0 KB na dagdag | ~300 KB na dagdag |
Para sa mga project kung saan mahalaga ang offline na trabaho at pagtitipid ng bandwidth, ang CachedNetworkImage ay ang malinaw na pagpipilian. Para sa mga simpleng isang beses na screen (hal. onboarding o splash), ang Image.network ay hindi nangangailangan ng karagdagang dependency.
Ang CachedNetworkImage ay idinadagdag bilang isang karaniwang pub.dev dependency. Pagkatapos ng pag-install, ang widget ay handa nang gamitin. Ang flutter_cache_manager ay pumapasok bilang isang transitive dependency.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Bilang default, ang DefaultCacheManager ay ginagamit na may mga setting: TTL = 7 araw, max 200 file. Para baguhin ang global na parameter, isang custom na CacheManager instance na may Config ay ginagawa, kung saan ang maxAgeCacheObject, maxNrOfCacheObjects at repo ay na-o-override.
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",
),
),
);
// Paggamit ng custom na manager:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes at maxHeightBytes — mga opsyonal na parameter para sa paglilimita sa laki ng naka-cache na file. Ito ay kapaki-pakinabang para sa pagtitipid ng disk space kapag ang orihinal na larawan ay mas malaki kaysa sa kinakailangang laki ng screen.
Mga Madalas Itanong
CachedNetworkImage — Flutter widget para sa pag-load ng mga larawan mula sa network na may awtomatikong caching sa disk. Ginagamit ito para sa pagtitipid ng bandwidth, pagtatrabaho sa offline mode at pagpapakita ng progreso ng pag-load, na wala sa karaniwang Image.network.
Idagdag ang cached_network_image: ^3.4.1 sa dependencies section ng pubspec.yaml file at patakbuhin ang flutter pub get. Pagkatapos ay i-import ang package sa file: import 'package:cached_network_image/cached_network_image.dart'.
Gumawa ng custom na CacheManager na may Config, kung saan ang parameter na stalePeriod ay tinukoy bilang Duration. Ipasa ang ginawang manager sa cacheManager parameter ng CachedNetworkImage widget. Bilang default, ang mga file ay iniimbak ng 7 araw.
Tawagan ang DefaultCacheManager().emptyCache() para sa buong pag-clear ng lahat ng file. Para sa pag-clear lamang ng mga nag-expire, gamitin ang cleanCache(). Ang custom na manager ay na-clear sa pamamagitan ng pagtawag ng emptyCache sa instance nito.
Oo, ang CachedNetworkImage ay sumusuporta sa Android, iOS, Web, macOS, Windows at Linux. Ang pare-parehong API ay nagsisiguro ng parehong pag-uugali sa lahat ng platform, at ang caching ay gumagana sa pamamagitan ng flutter_cache_manager na iniakma para sa bawat OS.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din