likes
comments
collection
share

[译]Flutter缓存管理库flutter_cache_manager

作者站长头像
站长
· 阅读数 5

本文翻译自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
评论
请登录