Максимальный предел размера кэша в flutter

#flutter

#флаттер

Вопрос:

Я использую Firestore в качестве базы данных и cached_network_image для загрузки и кэширования изображений в моем приложении flutter (iOS и Android). Я заметил, что размер кэша приложения становится слишком большим ( 300 МБ) после запуска приложения на некоторое время (в режиме отладки). Существует ли максимальное ограничение на размер кэша, который приложение использует во flutter? Есть ли способ принудительно ограничить размер кэша таким образом, чтобы всякий раз, когда размер кэша достигал максимального предела, самые старые кэшированные файлы удалялись?

Ответ №1:

cached_network_image зависит от flutter_cache_manager

CacheManager для загрузки и кэширования файлов в каталоге кэша приложения. Можно изменить различные настройки продолжительности хранения файла.

Как это работает

По умолчанию кэшированные файлы хранятся во временном каталоге приложения. Это означает, что ОС может удалить файлы в любое время.

Информация о файлах хранится в базе данных с использованием sqflite. Имя файла базы данных является ключом CacheManager, поэтому оно должно быть уникальным.

Эта информация о кэше содержит конечную дату, до которой файл является действительным, и ETag для использования с http cache-control.

методы

removeFile удаляет файл из кэша.

emptyCache удаляет все файлы из кэша.

пример

 void _clearCache() {
    DefaultCacheManager().emptyCache();
    
  }
  

если вы хотите иметь возможность удалять изображения через некоторое время, вам придется реализовать пользовательский кэш, который удаляет изображения через определенное количество дней.

из документов TL: DR

 class CustomCacheManager extends BaseCacheManager {
  static const key = "customCache";

  static CustomCacheManager _instance;

  factory CustomCacheManager() {
    if (_instance == null) {
      _instance = new CustomCacheManager._();
    }
    return _instance;
  }

  CustomCacheManager._() : super(key,
      maxAgeCacheObject: Duration(days: 7),
      maxNrOfCacheObjects: 20);

  Future<String> getFilePath() async {
    var directory = await getTemporaryDirectory();
    return p.join(directory.path, key);
  }
  

Ответ №2:

Кэш изображений может кэшировать до 1000 изображений и до 100 МБ. Это может быть больше, но это минимум 100 МБ.

Комментарии:

1. У вас есть какой-либо источник?

2. api.flutter.dev/flutter/painting/ImageCache-class.html

Ответ №3:

Для вашего варианта использования используйте extended_image для кэширования изображения и очистите кэш с помощью метода clearDiskCachedImages

 // Clear the disk cache directory then return if it succeed.
///  <param name="duration">timespan to compute whether file has expired or not</param>
Future<bool> clearDiskCachedImages({Duration duration})