Flutter 获取应用缓存,及清理应用缓存

在 Android 和 IOS 中,都有需要获取应用缓存和清除应用缓存的功能,那么在 flutter 里面应该怎么做呢?

获取应用缓存

要想获取到应用缓存,我们就必须找到用来装缓存数据的文件夹,所以这里我们需要引入 path_provider , 用来获取 Android 和 IOS 的缓存文件夹,然后再根据文件循环计算出缓存文件的大小。

首先,我们先简单介绍一下 path_provider 中获取文件夹的方法:

getExternalStorageDirectory(); // 在iOS上,抛出异常,在Android上,这是getExternalStorageDirectory的返回值
getTemporaryDirectory(); // 在iOS上,对应NSTemporaryDirectory()返回的值,在Android上,这是getCacheDir的返回值。
getApplicationDocumentsDirectory(); // 在iOS上,这对应NSDocumentsDirectory,在Android上,这是AppData目录
直到如何使用 path_provider 后,我们正式开始:

1、获取缓存(加载缓存)

///加载缓存
Future loadCache() async {
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); // _cacheSizeStr用来存储大小的值
});
}
2、循环计算文件的大小(递归)

Future _getTotalSizeOfFilesInDir(final FileSystemEntity file) async {
if (file is File) {
int length = await file.length();
return double.parse(length.toString());
}
if (file is Directory) {
final List children = file.listSync();
double total = 0;
if (children != null)
for (final FileSystemEntity child in children)
total += await _getTotalSizeOfFilesInDir(child);
return total;
}
return 0;
}
3、格式化缓存文件大小

_renderSize(double value) {
if (null == value) {
return 0;
}
List 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];
}
清除缓存

通过 path_provider 得到缓存目录,然后通过递归的方式,删除里面所有的文件。

void _clearCache() async {
Directory tempDir = await getTemporaryDirectory();
//删除缓存目录
await delDir(tempDir);
await loadCache();
FlutterToast.showToast(msg: '清除缓存成功');
}
///2020.06.23更改:不需要递归删除,直接删除子目录和文件即可
Future delDir(FileSystemEntity file) async {
if (file is Directory) {
final List children = file.listSync();
for (final FileSystemEntity child in children) {
//await delDir(child);
await child.delete();
}
}

}

你可能感兴趣的:(Flutter 获取应用缓存,及清理应用缓存)