在Flutter中实现图片下载缓存,可以通过以下方法:
1. 使用cached_network_image包(推荐)
这是最常用的图片缓存解决方案:
import 'package:cached_network_image/cached_network_image.dart';
CachedNetworkImage(
imageUrl: "http://example.com/image.jpg",
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
fit: BoxFit.cover,
)
2. 基本配置
在pubspec.yaml中添加依赖:
dependencies:
cached_network_image: ^3.3.0
3. 高级配置
CachedNetworkImage(
imageUrl: "http://example.com/image.jpg",
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider,
fit: BoxFit.cover,
),
),
),
placeholder: (context, url) => Container(
color: Colors.grey[300],
child: Icon(Icons.image),
),
errorWidget: (context, url, error) => Icon(Icons.error),
cacheManager: DefaultCacheManager(),
maxHeightDiskCache: 1000, // 最大磁盘缓存高度
maxWidthDiskCache: 1000, // 最大磁盘缓存宽度
)
4. 手动管理缓存
import 'package:cached_network_image/cached_network_image.dart';
// 预加载图片
await DefaultCacheManager().getSingleFile(url);
// 清除缓存
await DefaultCacheManager().emptyCache();
// 删除特定图片缓存
await DefaultCacheManager().removeFile(url);
5. 自定义缓存管理器
class CustomCacheManager extends BaseCacheManager {
static const key = "customCache";
static CustomCacheManager _instance;
factory CustomCacheManager() {
_instance ??= CustomCacheManager._();
return _instance;
}
CustomCacheManager._() : super(key,
maxAgeCacheObject: Duration(days: 7),
maxNrOfCacheObjects: 100
);
@override
Future<String> getFilePath() async {
var directory = await getTemporaryDirectory();
return p.join(directory.path, key);
}
}
主要特性
- 自动缓存:首次下载后自动缓存
- 内存缓存:提高重复加载速度
- 磁盘缓存:持久化存储
- 错误处理:加载失败时的备用方案
- 占位符:加载过程中的显示内容
这种方法简单高效,适合大多数图片缓存需求。