10 методов эффективной загрузки и отображения изображений во Flutter с помощью CachedNetworkImage

В Flutter эффективная загрузка и отображение изображений имеет решающее значение для создания плавных и отзывчивых пользовательских интерфейсов. Одним из популярных пакетов, упрощающих эту задачу, является CachedNetworkImage. В этом сообщении блога мы рассмотрим 10 различных методов эффективного использования CachedNetworkImage, попутно предоставляя вам практические примеры кода. Итак, приступим!

Метод 1: базовое использование
Самый простой способ использовать CachedNetworkImage — указать URL-адрес изображения. Пакет автоматически извлекает и кэширует изображение. Вот пример:

CachedNetworkImage(imageUrl: 'https://example.com/image.jpg')

Метод 2: заполнители и виджеты ошибок
Вы можете указать собственные виджеты, которые будут отображаться во время загрузки изображения или в случае возникновения ошибки. Это полезно для обеспечения лучшего пользовательского опыта. Посмотрите этот фрагмент кода:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
)

Метод 3: стратегии кэширования
CachedNetworkImage позволяет вам контролировать способ кэширования изображений. Вы можете выбирать различные стратегии кэширования, например кэширование изображений только в памяти или на диске. Вот пример:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  cacheManager: CacheManager(
    Config(
      storageBucketName: 'my_bucket',
      maxAgeCacheObject: Duration(days: 7),
    ),
  ),
)

Метод 4: собственный ключ кэша
Вы можете предоставить CachedNetworkImage собственный ключ кэша, чтобы иметь больший контроль над процессом кэширования. Это полезно, когда один и тот же URL-адрес изображения может привести к разному содержимому изображения. Вот как это работает:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  cacheManager: CacheManager(
    Config(
      keyBuilder: (url) => url.toString() + 'custom_key',
    ),
  ),
)

Метод 5: заголовки изображений
Если URL-адреса изображений требуют определенных заголовков для аутентификации или других целей, CachedNetworkImage позволяет передавать пользовательские заголовки. Вот пример:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  httpHeaders: {'Authorization': 'Bearer my_token'},
)

Метод 6: анимация кроссфейда
Вы можете добавить плавную анимацию кроссфейда при загрузке или изменении изображения. Это может улучшить визуальный опыт. Посмотрите этот фрагмент кода:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  fadeInDuration: Duration(milliseconds: 500),
  fadeOutDuration: Duration(milliseconds: 500),
)

Метод 7: манипулирование изображениями
CachedNetworkImage поддерживает различные параметры манипулирования изображениями, такие как изменение размера, обрезка и применение фильтров. Он использует мощную библиотеку манипуляций с изображениями под названием flutter_advanced_networkimage. Вот пример:

CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  imageBuilder: (context, imageProvider) => Image(
    image: imageProvider,
    fit: BoxFit.cover,
    alignment: Alignment.topCenter,
    filterQuality: FilterQuality.high,
  ),
)

Метод 8. Предварительная загрузка изображений
Чтобы повысить производительность, вы можете предварительно загрузить изображения, чтобы они были готовы к отображению при необходимости. Для этой цели CachedNetworkImage предоставляет метод предварительного кэширования. Вот как вы можете его использовать:

CachedNetworkImageProvider('https://example.com/image.jpg').resolve(
  CachedNetworkImageConfiguration(preload: true),
);

Метод 9: собственный менеджер кэша
Вы можете создать собственный менеджер кэша, расширив класс BaseCacheManager. Это позволяет вам реализовать собственную логику кэширования, например, использовать другой сервер хранения. Вот пример:

class MyCacheManager extends BaseCacheManager {
  MyCacheManager() : super('my_cache_key');
  @override
  Future<String> getFilePath() async {
    // Implement your logic to get the file path
  }
}
CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  cacheManager: MyCacheManager(),
)

Метод 10: обработка ошибок и повторная попытка
CachedNetworkImage предоставляет обратные вызовы для обработки ошибок и повторной попытки загрузки изображений. Это полезно в сценариях, где вы хотите отобразить пользовательское сообщение об ошибке или повторить загрузку после определенной задержки. Посмотрите этот пример: