CachedNetworkImage — şəbəkədən şəkillərin yüklənməsi və keşlənməsi üçün Flutter vidjetidir, gedişat, placeholder və səhv idarəetməsi dəstəyi ilə. Paketin rəsmi səhifəsinə görə, kitabxana flutter_cache_manager əsasında qurulub və konfiqurasiya edilə bilən TTL ilə diskdə avtomatik keşləmə təmin edir. CachedNetworkImage keşləmə ilə Flutter tətbiqlərində şəkillərin yüklənməsi üçün standart həll yoludur.
Başlıca
CachedNetworkImage — eyni adlı pub.dev paketindən Flutter vidjeti, avtomatik keşləmə ilə şəbəkədən şəkillərin yüklənməsini təmin edir. O, standart Image.network üzərində əlavədir, fayl keşləmə, gedişat göstəriciləri və fərdi səhv idarəetməsi əlavə edir.
Daxildə CachedNetworkImage flutter_cache_manager istifadə edir — faylları izləmək üçün SQLite verilənlər bazası olan keş meneceri. İlk sorğuda şəkil şəbəkədən yüklənir, diskdə saxlanılır və sonrakı sorğularda TTL nəzərə alınmaqla keşdən verilir (standart olaraq 7 gün). In-memory keş Flutter-in standart ImageCache-i tərəfindən idarə olunur.
Paketin pub.dev-də 4 000-dən çox bəyənməsi var və minlərlə Flutter layihəsində istifadə olunur. CachedNetworkImage bütün Flutter platformalarını dəstəkləyir: Android, iOS, Web, macOS, Windows və Linux. Vahid API sayəsində tərtibatçı platforma spesifik kodu olmadan çarpaz platformalı şəkil yükləməsi əldə edir.
Flutter iki səviyyəli keşləmə sistemindən istifadə edir: ImageCache (yaddaş) və flutter_cache_manager (disk + SQLite). ImageCache — say (standart 1000) və ölçü (standart 100 MB) limiti olan dekodlanmış şəkillərin qlobal keşidir. flutter_cache_manager diskdəki faylları və onların metadatlarını idarə edir.
CachedNetworkImage şəkil sorğusu aldıqda, əvvəlcə Flutter ImageCache-ini yoxlayır — əgər şəkil artıq yaddaşda dekodlanıbsa, dərhal göstərilir. Əskik olduqda, disk flutter_cache_manager vasitəsilə yoxlanılır: SQLite sorğusu faylın keşdə olub-olmadığını və TTL-nin bitmədiyini yoxlayır. Əgər fayl aktualdırsa — diskdən oxunur, dekodlanır və göstərilir. Əgər fayl yoxdursa və ya TTL bitibsə — HTTP sorğusu yerinə yetirilir.
DefaultCacheManager emptyCache() (tam təmizləmə), cleanCache() (yalnız köhnəlmiş silmə) və fərdi tarixlə clearCacheWithAge() metodlarını təqdim edir. ImageCache yaddaş çatışmazlığında avtomatik və ya əl ilə imageCache.clear() vasitəsilə təmizlənir.
CachedNetworkImage standart Flutter vidjetlərinin kompozisiyası üzərində qurulub. Daxili implementasiya asinxron yükləmə üçün ImageProvider və həyat dövrünü izləmək üçün StatefulWidget istifadə edir.
imageUrl — məcburi parametr, şəkil URL-i (String və ya Uri). placeholder — yükləmə zamanı göstərilən vidjet. errorWidget — yükləmə xətasında vidjet. progressIndicatorBuilder — kontekst, URL və totalSize və downloadedSize sahələri olan DownloadProgress alan builder.
CachedNetworkImageProvider — yükləmə və keşləməni idarə edən CachedNetworkStreamImage qaytaran ImageProvider implementasiyası. Provayder Flutter ImageCache ilə inteqrasiya olunur və standart ImageProvider-ın bütün imkanlarını dəstəkləyir: miqyaslama, mərkəzləşdirmə və təkrarlama.
flutter_cache_manager — CachedNetworkImage keşləməsinin əsasında duran kitabxana. O, konfiqurasiya edilmiş SQLite verilənlər bazası, TTL və fayl limiti ilə DefaultCacheManager təqdim edir. Lazım gəldikdə unikal parametrlərlə fərdi CacheManager yaradıla bilər.
| Parametr | Təsvir | Standart dəyər |
|---|---|---|
| maxAgeCacheObject | Faylın maksimum saxlanma müddəti | 7 gün |
| maxNrOfCacheObjects | Maksimum fayl sayı | 200 |
| key | Menecerin unikal identifikatoru | "default" |
| repo | Metaməlumat anbarının növü | CacheObjectRepository (SQLite) |
| fileService | Yükləmə üçün HTTP müştərisi | HttpFileService |
Fərdi CacheManager metodları əvəz etməklə CacheManager-dən miras alınaraq yaradılır. Bu, şəkilləri ayrıca kataloqda saxlamaq və ya fərqli HTTP müştərisi istifadə etmək lazım olduqda faydalıdır. Sonra menecer nüsxəsi CachedNetworkImage-ın cacheManager parametrinə ötürülür.
DefaultCacheManager-in SQLite verilənlər bazası tətbiqin temporaryDirectory kataloqunda `{key}/CacheObjects.db` yolunda yerləşir. O, key (URL), relativePath, url, creationDate, eTag, httpHeaders sahələri olan cacheObjects cədvəlini ehtiva edir. Köhnəlmiş qeydləri təmizləyərkən maxAgeCacheObject-ə görə şərti olan SQL sorğusu istifadə olunur.
CachedNetworkImage iki əsas yükləmə üsulu təqdim edir: CachedNetworkImage vidjeti və fərdi ssenarilər üçün CachedNetworkImageProvider provayderi.
CachedNetworkImage — əsas üsul. Sadəcə imageUrl və placeholder ötürmək kifayətdir. Vidjet avtomatik olaraq yükləmə tamamlanana qədər placeholder göstərir və sonra şəkillə əvəz edir.
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 və errorWidget — kontekst, URL və (errorWidget üçün) xəta obyekti qəbul edən builder funksiyalarıdır. Bu yanaşma URL və ya xəta növündən asılı olaraq müxtəlif əvəzedicilər göstərməyə imkan verir.
progressIndicatorBuilder — yükləmə gedişatını faizlə göstərməyə imkan verən parametr. DownloadProgress totalSize (ölçü bilinmirsə -1 ola bilər) və downloadedSize ehtiva edir.
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 — şəkil göstərilməsini fərdiləşdirməyə imkan verən isteğe bağlı parametr: yuvarlaqlaşdırma, kölgə, dekorasiya əlavə etmək. Nümunədə yuvarlaq künclər üçün BorderRadius ilə DecorationImage istifadə olunur.
CachedNetworkImageProvider — CachedNetworkImage vidjeti olmadan Image və ya DecorationImage üçün provayder. BoxDecoration, FadeInImage və ya fərdi Image vidjetləri ilə işləyərkən faydalıdır.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
CachedNetworkImage-da imageBuilder parametri standart Image vidjetini fərdi implementasiya ilə əvəz etməyə imkan verir. Birbaşa Image göstərmək əvəzinə dekorasiyalı Container, kəsikli ClipRRect və ya dalğa effekti üçün Ink.image istifadə edilə bilər. imageBuilder hazır şəklin kontekstini və ImageProvider-nı alaraq renderə tam nəzarət verir.
Əlavə parametrlər: memCacheWidth və memCacheHeight operativ yaddaşda keşlənmiş şəklin ölçüsünü məhdudlaşdıraraq Flutter ImageCache yükünü azaldır. cacheKey URL əvəzinə fərdi keş açarı təyin etməyə imkan verir, bu URL-də avtorizasiya tokenləri olan şəkillər üçün faydalıdır (sorğu parametrləri hər dəfə dəyişir, lakin məzmun eyni qalır).
Standart Image.network vidjeti hər vidjet yenidən qurulmasında şəkli diskdə saxlamadan yükləyir. CachedNetworkImage fayl keşləmə, gedişat və səhv idarəetməsi əlavə edir, lakin flutter_cache_manager və SQLite-dən asılılıq yaradır.
| Meyar | Image.network | CachedNetworkImage |
|---|---|---|
| Diskdə keş | Xeyr (yalnız Flutter yaddaş keşi) | Bəli (SQLite + fayllar) |
| Gedişat | Xeyr | progressIndicatorBuilder |
| Xəta vidjeti | Yalnız debug-da qırmızı placeholder | Fərdi errorWidget |
| Keş TTL | Tətbiq edilmir | Konfiqurasiya olunan (standart 7 gün) |
| Asılılıqlar | Xeyr (Flutter daxilində) | cached_network_image + flutter_cache_manager + sqflite |
| Offline giriş | Xeyr | Bəli (əvvəlcədən yüklənmiş fayllarla) |
| Qurma ölçüsü | 0 KB əlavə | ~300 KB əlavə |
Offline iş və trafikə qənaətin vacib olduğu layihələr üçün CachedNetworkImage birbaşa seçimdir. Sadə birdəfəlik ekranlar üçün (məsələn, onboarding və ya splash) Image.network əlavə asılılıq tələb etmir.
CachedNetworkImage standart pub.dev asılılığı kimi əlavə olunur. Quraşdırmadan sonra vidjet istifadəyə hazırdır. flutter_cache_manager tranzitiv asılılıq kimi daxil olur.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
Standart olaraq DefaultCacheManager parametrlərlə istifadə olunur: TTL = 7 gün, maks. 200 fayl. Qlobal parametrləri dəyişmək üçün Config ilə fərdi CacheManager nüsxəsi yaradılır, burada maxAgeCacheObject, maxNrOfCacheObjects və repo əvəz edilir.
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",
),
),
);
// Fərdi menecerdən istifadə:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes və maxHeightBytes — keşlənmiş faylın ölçüsünü məhdudlaşdırmaq üçün isteğe bağlı parametrlər. Orijinal şəkil lazım olduğundan böyük olduqda disk yerinə qənaət etmək üçün faydalıdır.
Tez-tez verilən suallar
CachedNetworkImage — şəbəkədən şəkillərin diskdə avtomatik keşləmə ilə yüklənməsi üçün Flutter vidjeti. Trafikə qənaət, offline rejimdə iş və yükləmə gedişatını göstərmək üçün lazımdır, standart Image.network-də bunlar yoxdur.
pubspec.yaml faylının dependencies bölməsinə cached_network_image: ^3.4.1 əlavə edin və flutter pub get icra edin. Sonra paketi faylda import edin: import 'package:cached_network_image/cached_network_image.dart'.
Config ilə fərdi CacheManager yaradın, burada stalePeriod parametri Duration kimi göstərilir. Yaradılmış meneceri CachedNetworkImage vidjetinin cacheManager parametrinə ötürün. Standart olaraq fayllar 7 gün saxlanılır.
Bütün faylları tam təmizləmək üçün DefaultCacheManager().emptyCache() çağırın. Yalnız köhnəlmiş faylları təmizləmək üçün cleanCache() istifadə edin. Fərdi menecer onun nüsxəsində emptyCache çağırmaqla təmizlənir.
Bəli, CachedNetworkImage Android, iOS, Web, macOS, Windows və Linux-u dəstəkləyir. Vahid API bütün platformalarda eyni davranışı təmin edir, keşləmə isə hər ƏS-ə uyğunlaşdırılmış flutter_cache_manager vasitəsilə işləyir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun