跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. Flutter 缓存管理库 fluttercachemanager 详解
  2. 核心功能与用法
  3. 基础文件获取
  4. 图片缓存 (ImageCacheManager)
  5. 自定义配置
  6. 配置参数说明
  7. 关键配置项详解
  8. 常见问题解答
  9. 1. 缓存文件如何存储?
  10. 2. 缓存的文件何时更新?
  11. 3. 缓存的文件何时删除?
  12. v2 版本的破坏性变更
  13. 最佳实践建议
  • 💰 8折买阿里云服务器限时8折了解详情
Dart大前端

Flutter 缓存管理库 flutter_cache_manager 使用指南

Flutter 缓存管理库 flutter_cache_manager 的核心功能与使用方法。该库支持下载和缓存应用目录中的文件,利用 Cache-Control 和 ETag 头部高效管理文件生命周期。内容涵盖基础文件获取、图片缓存、自定义配置(包括过期时间、数量限制、存储仓库)、常见问题解答以及 v2 版本的破坏性变更说明。文章强调了 Key 唯一性的重要性,并提供了关于存储位置、更新机制及删除策略的详细解释,同时给出了针对敏感数据和内存管理的最佳实践建议。

念念不忘发布于 2025/2/7更新于 2026/4/201 浏览
Flutter 缓存管理库 flutter_cache_manager 使用指南

Flutter 缓存管理库 flutter_cache_manager 详解

flutter_cache_manager 是 Flutter 应用中用于下载和管理文件缓存的常用库。它支持将文件存储在应用的缓存目录中,并通过配置控制缓存的有效期和数量。该库利用 HTTP 的 Cache-Control 头部来高效地提取和验证文件。

核心功能与用法

基础文件获取

CacheManager 提供了多种方式来获取文件,开发者可以根据具体场景选择合适的方法。

  1. 获取单个文件:最简单的方式是调用 getSingleFile。
    var file = await DefaultCacheManager().getSingleFile(url);
    
  2. 流式获取:getFileStream 返回一个流,第一个结果是已缓存的文件(如果有),后续结果包含正在下载的文件。
    // 仅获取缓存或开始下载
    Stream<FileResponse> stream = cacheManager.getFileStream(url);
    
    // 带进度回调,当缓存未命中时触发下载进程
    Stream<FileResponse> streamWithProgress = cacheManager.getFileStream(url, withProgress: true);
    
  3. 直接下载:downloadFile 直接从网络下载文件,不优先检查缓存。
  4. 仅从缓存读取:getFileFromCache 只尝试从本地缓存提取。如果缓存中没有文件,则返回空值(no file)。
  5. 手动添加文件:putFile 允许向缓存中添加一个新文件,无需经过网络下载流程。
  6. 清理操作:
    • removeFile:移除指定的单个文件。
    • emptyCache:清空所有缓存文件。

图片缓存 (ImageCacheManager)

对于图片资源,可以使用 ImageCacheManager Mixin(DefaultCacheManager 默认已集成)。它提供了 getImageFile 方法,支持在缓存前对图像进行尺寸调整。

Stream<FileResponse> getImageFile(String url, {
    String key,
    Map<String, String> headers,
    bool withProgress,
    int maxHeight,  // 目标最大高度
    int maxWidth,   // 目标最大宽度
})
  • 尺寸调整:URL 获取的图像会根据配置参数自动调整大小,调整后的图像会被存储到缓存中。通常它会保持现有的图片比例。
  • 原始缓存:如果使用其他高度/宽度参数,原始图像也会被缓存并用于调整,确保在不同显示需求下都能提供最佳质量。

自定义配置

可以通过创建新的 CacheManager 实例来实现更精细的管理。注意:不要使用相同的 key 创建多个 CacheManager 实例,否则会导致缓存冲突。

通常建议将管理器作为单例创建,或者通过 Provider 等状态管理方案在应用顶层提供。

配置参数说明

构造方法的 key 参数是强制性的,其他变量均为可选。以下是一个完整的自定义配置示例:

class CustomCacheManager {
  static const key = 'customCacheKey';
  
  static CacheManager instance = CacheManager(
    Config(
      key,
      // 缓存过期时间:7 天后视为过期
      stalePeriod: const Duration(days: 7),
      // 缓存对象最大数量:最多保留 20 个文件
      maxNrOfCacheObjects: 20,
      // 元数据存储仓库:使用 SQLite 数据库存储缓存信息
      repo: JsonCacheInfoRepository(databaseName: key),
      // 文件系统实现:IOFileSystem 表示使用本地文件系统
      fileSystem: IOFileSystem(key),
      // 文件服务:HttpFileService 负责网络请求
      fileService: HttpFileService(),
    ),
  );
}

关键配置项详解

  • stalePeriod:定义文件被视为'陈旧'的时间阈值。超过此时间的文件在下次访问时会尝试更新。
  • maxNrOfCacheObjects:限制缓存中的文件总数。当超出限制时,系统会根据最后使用时间删除旧文件。
  • repo:负责存储缓存元数据(如 URL、ETag、最后访问时间等)。Android/iOS/macOS 默认使用 SQLite (sqflite),其他平台使用 JSON 文件。
  • fileSystem:决定文件实际存储的位置。默认为应用缓存目录,可替换为自定义路径。
  • fileService:处理网络请求的逻辑,支持自定义拦截器或代理。

常见问题解答

1. 缓存文件如何存储?

默认情况下,缓存的文件存储在应用的缓存目录中。这意味着操作系统可能会在存储空间不足时随时删除这些文件。

  • 元数据存储:
    • Android、iOS 和 macOS:存储在 SQLite 数据库中,文件名与 CacheManager 的 key 一致。
    • 其他平台:存储在普通的 JSON 文件中。
  • 唯一性要求:由于数据库文件名由 key 决定,因此必须保证 key 的唯一性,避免不同管理器之间互相覆盖数据。

2. 缓存的文件何时更新?

文件更新机制依赖于 HTTP 响应头:

  • Cache-Control Header:有效的 URL 响应应包含此头部,指示客户端保持最新状态的期望时长。
  • ETag:服务器通常会保存 ETag,用于检查指定时间之后文件是否发生改变。

更新逻辑:

  1. 调用 getSingleFile 或 getFileStream 时,首先检查缓存。
  2. 如果缓存有效(未过期且 ETag 匹配),直接返回缓存文件。
  3. 如果判断文件已过期,管理器会发起网络请求验证文件有效性。
  4. 若文件已更新,则存储新文件到缓存,并在流中返回更新后的文件。

3. 缓存的文件何时删除?

文件可能因以下原因被删除:

  • 操作系统清理:应用在更新或系统清理缓存目录时,文件可能被移除。
  • 管理器策略:CacheManager 根据两个变量主动删除文件:
    1. maxNrOfCacheObjects:超过最大数量限制。
    2. stalePeriod:超过过期时间且未被使用。

当需要清空缓存时,管理器会按最后使用时间排序,优先删除那些超过过期时间很久且使用频率低的文件。

v2 版本的破坏性变更

升级到 v2 版本时,请注意以下主要变化:

  1. 继承方式改变:不再需要继承 BaseCacheManager,可以直接调用 CacheManager 的构造函数。BaseCacheManager 现在仅作为一个接口存在。
  2. 配置对象变更:构造函数现在需要一个配置对象(Config),而非直接传递参数。这提供了更大的灵活性,例如可以自定义存储文件的文件系统,而不仅仅是目录。
  3. 示例参考:请参考官方文档中的最新示例代码以适配新的 API 结构。

最佳实践建议

  1. Key 的唯一性:确保每个 CacheManager 实例都有唯一的 key,防止元数据冲突。
  2. 敏感数据保护:缓存目录通常位于应用沙盒内,但不应缓存包含敏感信息的文件(如 Token、密码),除非进行了额外的加密处理。
  3. 内存管理:对于大文件,建议设置合理的 maxNrOfCacheObjects 和 stalePeriod,避免占用过多磁盘空间。
  4. 网络异常处理:在使用 getFileStream 时,建议监听流的错误事件,以便在网络不可用时提供降级体验。
  5. 图片优化:使用 ImageCacheManager 时,合理设置 maxHeight 和 maxWidth,避免缓存过大的原始图片导致内存浪费。
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • Android 编程权威指南:深入理解 Intent 与任务机制(一)
  • Dart 类基础与进阶用法
  • Kotlin 结合属性动画实现糖果捕捉游戏
  • 基于大模型与知识库的 Code Review 实践
  • 大语言模型(LLM)入门指南与核心技术解析
  • 大模型分布式训练方法:数据、张量与流水线并行详解
  • Kotlin 运算符重载及常用约定详解:算术、比较与集合区间
  • Android 主线程与 UI 线程关系源码深度解析
  • Android 电话操作指南:拨打、监听与拦截
  • RxJava 迁移至 Kotlin Flow 的背压策略对比与实现
  • Android 原生安全音量功能实现原理与定制分析
  • Flutter Platform Channel 通信机制与原理详解
  • Android 中高级开发核心面试题与解析
  • 程序员求职现状分析:行业寒冬下的赛道选择与技能提升
  • Android 初中级工程师进阶高级工程师的技术路径与核心能力构建
  • Android Framework 核心源码解析:从系统启动到应用框架详解
  • 当前互联网行情下,程序员职业前景分析与发展建议
  • Android 转行车载开发:核心难点与学习路径解析
  • Android 开发核心面试题汇总:Java、Kotlin、Flutter 及 Framework
  • 金九银十 Android 面试高频真题集:Java、框架与音视频详解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online