在 Android 和 IOS 中,都有需要獲取應(yīng)用緩存和清除應(yīng)用緩存的功能,那么在 flutter 里面應(yīng)該怎么做呢?
獲取應(yīng)用緩存
要想獲取到應(yīng)用緩存,我們就必須找到用來(lái)裝緩存數(shù)據(jù)的文件夾,所以這里我們需要引入 path_provider , 用來(lái)獲取 Android 和 IOS 的緩存文件夾,然后再根據(jù)文件循環(huán)計(jì)算出緩存文件的大小。
首先,我們先簡(jiǎn)單介紹一下 path_provider 中獲取文件夾的方法:
getExternalStorageDirectory(); // 在iOS上,拋出異常,在Android上,這是getExternalStorageDirectory的返回值
getTemporaryDirectory(); // 在iOS上,對(duì)應(yīng)NSTemporaryDirectory()返回的值,在Android上,這是getCacheDir的返回值。
getApplicationDocumentsDirectory(); // 在iOS上,這對(duì)應(yīng)NSDocumentsDirectory,在Android上,這是AppData目錄
直到如何使用 path_provider 后,我們正式開(kāi)始:
1、獲取緩存(加載緩存)
///加載緩存
Future<Null> loadCache() async {
Directory tempDir = await getTemporaryDirectory();
double value = await _getTotalSizeOfFilesInDir(tempDir);
/tempDir.list(followLinks: false,recursive: true).listen((file){
//打印每個(gè)緩存文件的路徑
print(file.path);
});/
print('臨時(shí)目錄大小: ' + value.toString());
setState(() {
_cacheSizeStr = _renderSize(value); // _cacheSizeStr用來(lái)存儲(chǔ)大小的值
});
}
2、循環(huán)計(jì)算文件的大?。ㄟf歸)
Future<double> _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<FileSystemEntity> 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<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];
}
清除緩存
通過(guò) path_provider 得到緩存目錄,然后通過(guò)遞歸的方式,刪除里面所有的文件。
void _clearCache() async {
Directory tempDir = await getTemporaryDirectory();
//刪除緩存目錄
await delDir(tempDir);
await loadCache();
FlutterToast.showToast(msg: '清除緩存成功');
}
///2020.06.23更改:不需要遞歸刪除,直接刪除子目錄和文件即可
Future<Null> delDir(FileSystemEntity file) async {
if (file is Directory) {
final List<FileSystemEntity> children = file.listSync();
for (final FileSystemEntity child in children) {
//await delDir(child);
await child.delete();
}
}
}