[译]Flutter缓存管理库flutter_cache_manager
本文翻译自pub: flutter_cache_manager | Flutter Package (flutter-io.cn)
译时版本: flutter_cache_manager 3.3.0
v2的破坏性改动
CacheManager v2 当配置自定义 CacheManager 时引入了一些破坏性改动。 查看页面最下方改动的说明
flutter_cache_manager
CacheManager 用于下载和缓存应用缓存目录中的文件。 缓存多长时间可通过各种设置来修改。 它使用 Cache-Control HTTP 头部来高效提取文件。
这里有一个更基础的用法的说明。更多信息参考完整文档。
用法
CacheManager 可用多种方式获取一个文件。获取单个文件最简单的方式是调用 .getSingleFile
。
var file = await DefaultCacheManager().getSingleFile(url);
getFileStream(url)
返回一个流,第一个结果是要缓存的文件,之后是要下载的文件。
getFileStream(url, withProgress: true)
withProgress 设为 true ,当缓存中找不到文件时,流会触发下载进程。
downloadFile(url)
直接从网络下载。
getFileFromCache
只从缓存提取,如果缓存里没有文件,会返回 no file (没有文件)。
putFile
提供选项用于向缓存中添加一个新文件而不下载它。
removeFile
从缓存中移除一个文件。
emptyCache
从缓存中移除所有文件。
ImageCacheManager (图片缓存管理器)
如果对 CacheManager 使用了 ImageCacheManager mixin(DefaultCacheManager 默认已使用),就可以自由使用下面的 getImageFile
方法:
Stream<FileResponse> getImageFile(String url, {
String key,
Map<String, String> headers,
bool withProgress,
int maxHeight, // This is extra
int maxWidth, // This is extra as well
})
URL 获取的图像从根据配置参数调整大小,调整大小后的图像会被存储到缓存中。通常它会保持现有的图片比例。 如果使用其它 高度/宽度 参数,原始图像也会被缓存并用于调整。
其它实现
如果你的文件存储在 Firebase Storage 上,可以使用 flutter_cache_manager_firebase 。
自定义
缓存管理器可以通过创建一个新的 CacheManager 来管理。 不要用相同的 key 创建多于一个的 CacheManager ,它们会彼此冲突,这点非常重要。 在这下面的例子中,管理器作为单例创建,但你可以用于示例的 Provider 以在应用的顶级提供一个 CacheManager。下面的例子中有用于文件最大世代、对象最大数量和自定义文件服务的设置。 构造方法的 key 参数是强制的,其它所有变量都是可选的。
class CustomCacheManager {
static const key = 'customCacheKey';
static CacheManager instance = CacheManager(
Config(
key,
stalePeriod: const Duration(days: 7),
maxNrOfCacheObjects: 20,
repo: JsonCacheInfoRepository(databaseName: key),
fileSystem: IOFileSystem(key),
fileService: HttpFileService(),
),
);
}
常见问题
缓存文件如何存储?
默认情况下,缓存的文件存储在应用的缓存目录中。这意味着操作系统会随时删除文件。
文件的信息在 Android 、 iOS 和 macOS 中存储在 sqflite 数据库中,在其它平台存储在普通的 JSON 文件中。数据库的文件名是 cacheManager 的 key ,这也是它必须唯一的原因。
缓存的文件何时更新?
一个有效的 URL 响应应该包含一个 Cache-Control header(头部)。关于 header 的更多信息查看这里,但是总的来说,它表示保持最新状态的期望时长。这也保存一个 'eTag' ,用于检查(指定的时间之后)文件是否发生改变或者实际上仍然有效。
在检查文件实际上仍然有效时,当调用 getSingleFile
或 getFileStream
时,总是直接返回缓存中的文件。如果根据 Cache-Control headers 判断文件已经过期,管理器会尝试更新文件,并存储一个新的文件到缓存中。当使用 getFileStream
时,更新后的文件也会在流中返回。
缓存的文件何时删除?
文件可以被缓存管理器或操作系统删除。默认情况下,文件存储在缓存目录下,有时会被清掉,例如在 Android 上应用更新时。
缓存管理器使用两个变量来决定何时删除一个文件, maxNrOfCacheObjects
和 stalePeriod
。
缓存知道文件最后被使用的时间。当清空缓存(这会持续发生)时,按最后使用时间排序有很多文件,还有文件超过过期时间很久未被使用的,缓存会删除这些文件。
v2的破坏性变更
- 这里不再需要继承 BaseCacheManager ,可以直接调用构造方法。 BaseCacheManager 现在只是一个接口。 CacheManager 是可以直接使用的实现。
- 构造方法现在需要一个带有一些设定的配置对象,但是一些稍微不同。例如,你想存储文件的系统不只是目录,而是一个文件系统。这使你有更多的自由来决定存储文件的位置。
- 参考自定义中的例子。
转载自:https://juejin.cn/post/7060142389788147742