You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何正确缓存字符串?求可用代码示例

正确实现字符串的缓存与离线加载(基于DefaultCacheManager)

原代码仅通过判断文件是否存在来确认缓存有效性,容易出现误判——比如文件存在但已损坏、缓存条目已过期,或是文件内容为空。以下是包含缓存写入和严谨缓存读取的完整可运行代码:

1. 依赖确保

确保你的pubspec.yaml中已添加flutter_cache_manager依赖:

dependencies:
  flutter_cache_manager: ^3.3.1 # 可替换为最新稳定版本

2. 完整代码示例

import 'package:flutter_cache_manager/flutter_cache_manager.dart';

// 获取字符串并自动缓存(网络优先,失败则读缓存)
Future<String?> fetchAndCacheAsdf(String baseUrl) async {
  final cacheKey = '$baseUrl/asdf';
  try {
    // 从网络获取并自动缓存,DefaultCacheManager会处理缓存存储
    final file = await DefaultCacheManager().getSingleFile(cacheKey);
    final content = await file.readAsString();
    
    // 验证内容有效性
    if (content.isNotEmpty) {
      return content;
    }
  } catch (e) {
    // 网络请求失败,降级读取缓存
    return await getValidAsdfFromCache(baseUrl);
  }
  return null;
}

// 严谨读取缓存,自动清理无效缓存
Future<String?> getValidAsdfFromCache(String baseUrl) async {
  final cacheKey = '$baseUrl/asdf';
  try {
    final cacheEntry = await DefaultCacheManager().getFileFromCache(cacheKey);
    
    if (cacheEntry != null && cacheEntry.file.existsSync()) {
      // 检查缓存是否过期(可选,根据业务需求调整)
      final isExpired = cacheEntry.validTill.isBefore(DateTime.now());
      if (isExpired) {
        await DefaultCacheManager().removeFile(cacheKey);
        return null;
      }
      
      // 读取并验证内容
      final content = await cacheEntry.file.readAsString();
      if (content.isNotEmpty) {
        return content;
      } else {
        // 清理空内容的无效缓存
        await DefaultCacheManager().removeFile(cacheKey);
      }
    }
  } catch (e) {
    // 文件损坏等异常,清理无效缓存
    await DefaultCacheManager().removeFile(cacheKey);
  }
  return null;
}

// 使用示例
void main() async {
  final baseUrl = 'https://your-server-domain.com';
  final asdfContent = await fetchAndCacheAsdf(baseUrl);
  
  if (asdfContent != null) {
    print('加载到内容:$asdfContent');
  } else {
    print('无有效缓存且网络不可用');
  }
}

关键优化点

  • 多层验证:除了文件存在性,额外检查缓存过期状态、内容有效性
  • 自动清理:发现无效缓存(过期、空内容、损坏)时自动删除,避免后续误判
  • 异常容错:捕获网络请求、文件读取异常,保证流程稳定性

内容的提问来源于stack exchange,提问作者user21695387

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:42:58