众所周知,Android和IOS都有需要获取应用缓存和清除应用缓存的功能,当然Flutter也能做到,接下来我们一起来看看该怎么做。
获取应用缓存:
首先我们需要导入path_provider,需要用到里面的一个方法获取Android和IOS的缓存文件夹,然后通过递归的方式获取该缓存文件夹下所有文件大小的总和,然后就能得到缓存大小了:
///加载缓存
Future<Null> loadCache() async {
try {
Directory tempDir = await getTemporaryDirectory();
double value = await _getTotalSizeOfFilesInDir(tempDir);
/*tempDir.list(followLinks: false,recursive: true).listen((file){
//打印每个缓存文件的路径
print(file.path);
});*/
print('临时目录大小: ' + value.toString());
setState(() {
_cacheSizeStr = _renderSize(value);
});
} catch (err) {
print(err);
}
}
/// 递归方式 计算文件的大小
Future<double> _getTotalSizeOfFilesInDir(final FileSystemEntity file) async {
try {
if (file is File) {
int length = await file.length();
return double.parse(length.toString());
}
if (file is Directory) {
final List<FileSystemEntity> children = file.listSync();
double total = 0;
if (children != null)
for (final FileSystemEntity child in children)
total += await _getTotalSizeOfFilesInDir(child);
return total;
}
return 0;
} catch (e) {
print(e);
return 0;
}
}
清理缓存:
清理缓存,同样是通过path_provider得到缓存目录,然后通过递归的方式,删除里面所有的文件
void _clearCache() async {
//此处展示加载loading
try {
Directory tempDir = await getTemporaryDirectory();
//删除缓存目录
await delDir(tempDir);
await loadCache();
ToastUtils.show(msg: '清除缓存成功');
} catch (e) {
print(e);
ToastUtils.show(msg: '清除缓存失败');
} finally {
//此处隐藏加载loading
}
}
///递归方式删除目录
Future<Null> delDir(FileSystemEntity file) async {
try {
if (file is Directory) {
final List<FileSystemEntity> children = file.listSync();
for (final FileSystemEntity child in children) {
await delDir(child);
}
}
await file.delete();
} catch (e) {
print(e);
}
}
需要格式化缓存文件大小参考一下代码:
///格式化文件大小
_renderSize(double value) {
if (null == value) {
return 0;
}
List<String> unitArr = List()
..add('B')
..add('K')
..add('M')
..add('G');
int index = 0;
while (value > 1024) {
index++;
value = value / 1024;
}
String size = value.toStringAsFixed(2);
return size + unitArr[index];
}