Flutter如何使用cached_network_image清理两周未访问的旧缓存图片
针对 flutter_cached_network_image 两周未访问缓存自动清理的实现方案
flutter_cached_network_image 本身依赖 flutter_cache_manager 实现底层缓存管理,你可以通过以下两种方案满足需求:
方案1:自定义 CacheManager 配置自动过期规则(最推荐)
直接自定义缓存管理器,将缓存对象的最大有效期设置为14天,框架会自动清理超过两周未被访问的缓存文件,无需手动写清理逻辑:
- 首先自定义全局单例的缓存管理器
import 'package:flutter_cache_manager/flutter_cache_manager.dart'; class MyImageCacheManager extends CacheManager { static const cacheKey = 'my_app_image_cache'; static final MyImageCacheManager _instance = MyImageCacheManager._init(); factory MyImageCacheManager() => _instance; MyImageCacheManager._init() : super( Config( cacheKey, // 核心配置:缓存文件14天未访问就会被标记为过期,自动清理 maxAgeCacheObject: const Duration(days: 14), // 可选附加配置:最多缓存2000个文件,超出容量时自动清理最久未使用的缓存 maxNrOfCacheObjects: 2000, ), ); }
- 在所有使用
CachedNetworkImage的位置指定你自定义的缓存管理器即可
CachedNetworkImage( imageUrl: "你的图片资源地址", cacheManager: MyImageCacheManager(), // 其余参数和原有配置保持一致即可 )
方案2:手动触发缓存清理(适合提供用户主动清理入口的场景)
如果你的应用需要给用户提供「一键清理缓存」的功能,可以直接调用缓存管理器的清理方法:
// 清理自定义缓存中所有超过14天未访问的过期文件 await MyImageCacheManager().removeOldFiles(); // 如果你用的是默认缓存管理器,就调用默认实例的方法 await DefaultCacheManager().removeOldFiles();
如果需要自定义清理规则,也可以遍历所有缓存文件手动筛选删除:
final allCachedFiles = await MyImageCacheManager().getFileFromCache(); final currentTime = DateTime.now(); for (var fileInfo in allCachedFiles) { if (currentTime.difference(fileInfo.validTill) > const Duration(days: 14)) { await MyImageCacheManager().removeFile(fileInfo.url); } }
注意事项
- 自定义缓存管理器必须用单例模式,不要重复实例化,否则会出现缓存不生效、清理规则不统一的问题
- 过期缓存的清理不是实时触发的,框架会在每次读写缓存时自动校验过期文件,你也可以在应用启动时主动调用一次
removeOldFiles()触发全量校验清理
内容的提问来源于stack exchange,提问作者Sohaib Aslam
相关产品推荐
相关产品推荐

