「这是我参与2022初次更文挑战的第17天,活动详情检查:2022初次更文挑战」。

本文翻译自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’ ,用于检查(指定的时刻之后)文件是否产生改变或者实际上依然有用。

在检查文件实际上依然有用时,当调用 getSingleFilegetFileStream 时,总是直接回来缓存中的文件。假如根据 Cache-Control headers 判断文件已经过期,管理器会测验更新文件,并存储一个新的文件到缓存中。当运用 getFileStream 时,更新后的文件也会在流中回来。

缓存的文件何时删去?

文件能够被缓存管理器或操作体系删去。默许情况下,文件存储在缓存目录下,有时会被清掉,例如在 Android 上运用更新时。

缓存管理器运用两个变量来决议何时删去一个文件, maxNrOfCacheObjectsstalePeriod
缓存知道文件最终被运用的时刻。当清空缓存(这会持续产生)时,按最终运用时刻排序有许多文件,还有文件超过过期时刻很久未被运用的,缓存会删去这些文件。

v2的破坏性变更

  • 这儿不再需求继承 BaseCacheManager ,能够直接调用结构办法。 BaseCacheManager 现在只是一个接口。 CacheManager 是能够直接运用的完成。
  • 结构办法现在需求一个带有一些设定的装备对象,但是一些略微不同。例如,你想存储文件的体系不只是目录,而是一个文件体系。这使你有更多的自由来决议存储文件的位置。
  • 参阅自定义中的比如。