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
相关产品推荐
相关产品推荐

