CachedNetworkImage е Flutter изглед за зареждане и кеширане на изображения от мрежата с поддръжка на напредък, placeholder и обработка на грешки. Според официалната страница на пакета, библиотеката е базирана на flutter_cache_manager и осигурява автоматично кеширане на диска с конфигурируем TTL. CachedNetworkImage е стандартното решение за зареждане на изображения с кеширане във Flutter приложения.
Основни точки
CachedNetworkImage е Flutter изглед от едноименния pub.dev пакет, който осигурява зареждане на изображения от мрежата с автоматично кеширане. Той е слой върху стандартния Image.network, добавящ файлово кеширане, индикатори за напредък и персонализирана обработка на грешки.
Вътрешно, CachedNetworkImage използва flutter_cache_manager — мениджър на кеша с база данни SQLite за проследяване на файлове. При първото искане, изображението се изтегля от мрежата, записва се на диска и при последващи искания се доставя от кеша, като се взема предвид TTL (по подразбиране 7 дни). In-memory кешът се управлява от стандартния ImageCache на Flutter.
Пакетът има повече от 4 000 харесвания в pub.dev и се използва в хиляди Flutter проекти. CachedNetworkImage поддържа всички Flutter платформи: Android, iOS, Web, macOS, Windows и Linux. Благодарение на единния API, разработчикът получава многоплатформено зареждане на изображения без код, специфичен за платформа.
Flutter използва двустепенна система за кеширане: ImageCache (памет) и flutter_cache_manager (диск + SQLite). ImageCache е глобален кеш на декодирани изображения с лимит на броя (по подразбиране 1000) и размера (по подразбиране 100 MB). flutter_cache_manager управлява файловете на диска и техните метаданни.
Когато CachedNetworkImage получи заявка за изображение, първо проверява ImageCache на Flutter — ако изображението вече е декодирано в паметта, то се показва незабавно. При липса, дискът се проверява чрез flutter_cache_manager: SQLite заявка проверява дали файлът съществува в кеша и дали TTL му не е изтекъл. Ако файлът е актуален — той се чете от диска, декодира се и се показва. Ако файлът не съществува или TTL е изтекъл — се изпълнява HTTP заявка.
DefaultCacheManager предоставя методи emptyCache() (пълно изчистване), cleanCache() (изтриване само на изтекли) и clearCacheWithAge() с персонализирана дата. ImageCache се изчиства автоматично при натиск върху паметта или ръчно чрез imageCache.clear().
CachedNetworkImage е изграден върху композиция от стандартни Flutter изгледи. Вътрешната имплементация използва ImageProvider за асинхронно зареждане и StatefulWidget за проследяване на жизнения цикъл.
imageUrl — задължителен параметър, URL на изображението (String или Uri). placeholder — изглед, показван по време на зареждане. errorWidget — изглед при грешка при зареждане. progressIndicatorBuilder — builder, който получава контекст, URL и DownloadProgress с полета totalSize и downloadedSize.
CachedNetworkImageProvider — имплементация на ImageProvider, връщаща CachedNetworkStreamImage, който управлява изтеглянето и кеширането. Провайдърът се интегрира с ImageCache на Flutter и поддържа всички възможности на стандартния ImageProvider: мащабиране, центриране и повторение.
flutter_cache_manager — библиотеката, която е в основата на кеширането на CachedNetworkImage. Тя предоставя DefaultCacheManager с конфигурирана SQLite база данни, TTL и лимит на файлове. При необходимост може да се създаде персонализиран CacheManager с уникални параметри.
| Параметър | Описание | Стойност по подразбиране |
|---|---|---|
| maxAgeCacheObject | Максимален срок на съхранение на файла | 7 дни |
| maxNrOfCacheObjects | Максимален брой файлове | 200 |
| key | Уникален идентификатор на мениджъра | „default“ |
| repo | Тип съхранение на метаданни | CacheObjectRepository (SQLite) |
| fileService | HTTP клиент за изтегляне | HttpFileService |
Персонализиран CacheManager се създава чрез наследяване от CacheManager с презаписване на методи. Това е полезно, когато трябва да се съхраняват изображения в отделна директория или да се използва различен HTTP клиент. След това инстанцията на мениджъра се предава на параметъра cacheManager на CachedNetworkImage.
SQLite базата данни на DefaultCacheManager се намира в директорията temporaryDirectory на приложението на пътя `{key}/CacheObjects.db`. Тя съдържа таблица cacheObjects с полета key (URL), relativePath, url, creationDate, eTag, httpHeaders. При изчистване на изтекли записи се използва SQL заявка с условие по maxAgeCacheObject.
CachedNetworkImage предоставя два основни начина на зареждане: изгледа CachedNetworkImage и провайдъра CachedNetworkImageProvider за персонализирани сценарии.
CachedNetworkImage — основният начин. Достатъчно е да предадете imageUrl и placeholder. Изгледът автоматично показва placeholder до завършване на зареждането и го заменя с изображението.
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 и errorWidget са builder функции, които приемат контекст, URL и (за errorWidget) обект на грешка. Този подход позволява показване на различни резервни варианти в зависимост от URL или типа грешка.
progressIndicatorBuilder — параметър, който позволява показване на процента на напредък на зареждане. DownloadProgress съдържа totalSize (може да бъде -1, ако размерът е неизвестен) и 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 — опционален параметър, който позволява персонализиране на показването на изображението: добавяне на заобляне, сянка, декорация. В примера се използва DecorationImage с BorderRadius за заоблени ъгли.
CachedNetworkImageProvider — провайдър за Image или DecorationImage без използване на изгледа CachedNetworkImage. Полезен при работа с BoxDecoration, FadeInImage или персонализирани Image изгледи.
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(
"https://example.com/bg.jpg",
maxWidthBytes: 2048,
maxHeightBytes: 2048,
),
fit: BoxFit.cover,
),
),
)
Параметърът imageBuilder в CachedNetworkImage позволява замяна на стандартния Image изглед с персонализирана имплементация. Вместо директно показване на Image, може да се използва Container с декорация, ClipRRect с изрязване или Ink.image за ripple ефект. imageBuilder получава контекст и ImageProvider на готовото изображение, давайки пълен контрол върху рендирането.
Допълнителни параметри: memCacheWidth и memCacheHeight ограничават размера на кешираното изображение в RAM паметта, намалявайки натоварването на ImageCache на Flutter. cacheKey позволява задаване на персонализиран ключ за кеша вместо URL, което е полезно за изображения с токени за упълномощаване в URL (параметрите на заявката се променят при всяка заявка, но съдържанието остава същото).
Стандартният изглед Image.network зарежда изображението при всяко преизграждане на изгледа, без да го записва на диска. CachedNetworkImage добавя файлово кеширане, напредък и обработка на грешки, но добавя зависимост от flutter_cache_manager и SQLite.
| Критерий | Image.network | CachedNetworkImage |
|---|---|---|
| Кеш на диска | Не (само кеш в паметта на Flutter) | Да (SQLite + файлове) |
| Напредък | Не | progressIndicatorBuilder |
| Error изглед | Само червен placeholder в debug | Персонализиран errorWidget |
| TTL на кеша | Не е приложимо | Конфигурируем (по подразбиране 7 дни) |
| Зависимости | Не (вграден във Flutter) | cached_network_image + flutter_cache_manager + sqflite |
| Офлайн достъп | Не | Да (при предварително изтеглени файлове) |
| Размер на компилация | 0 KB допълнително | ~300 KB допълнително |
За проекти, където офлайн работата и икономията на трафик са важни, CachedNetworkImage е недвусмисленият избор. За прости еднократни екрани (например onboarding или splash) Image.network не изисква допълнителни зависимости.
CachedNetworkImage се добавя като стандартна pub.dev зависимост. След инсталиране, изгледът е готов за използване. flutter_cache_manager влиза като транзитивна зависимост.
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.4.1
По подразбиране се използва DefaultCacheManager с настройки: TTL = 7 дни, макс. 200 файла. За промяна на глобални параметри се създава персонализирана инстанция на CacheManager с Config, където се презаписват maxAgeCacheObject, maxNrOfCacheObjects и 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",
),
),
);
// Използване на персонализиран мениджър:
CachedNetworkImage(
cacheManager: customCacheManager,
imageUrl: url,
// ...
)
maxWidthBytes и maxHeightBytes — опционални параметри за ограничаване на размера на кеширания файл. Това е полезно за икономия на дисково пространство, когато оригиналното изображение е по-голямо от необходимия размер на екрана.
Често задавани въпроси
CachedNetworkImage — Flutter изглед за зареждане на изображения от мрежата с автоматично кеширане на диска. Използва се за икономия на трафик, работа в офлайн режим и показване на напредъка на зареждане, което липсва в стандартния Image.network.
Добавете cached_network_image: ^3.4.1 в раздела dependencies на файла pubspec.yaml и изпълнете flutter pub get. След това импортирайте пакета във файла: import 'package:cached_network_image/cached_network_image.dart'.
Създайте персонализиран CacheManager с Config, където параметърът stalePeriod е посочен като Duration. Предайте създадения мениджър на параметъра cacheManager на изгледа CachedNetworkImage. По подразбиране файловете се съхраняват 7 дни.
Извикайте DefaultCacheManager().emptyCache() за пълно изчистване на всички файлове. За изчистване само на изтекли, използвайте cleanCache(). Персонализираният мениджър се изчиства чрез извикване на emptyCache на неговата инстанция.
Да, CachedNetworkImage поддържа Android, iOS, Web, macOS, Windows и Linux. Единният API осигурява еднакво поведение на всички платформи, а кеширането работи чрез flutter_cache_manager, адаптиран за всяка операционна система.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също