Flutter 獲取應(yīng)用緩存,及清理應(yīng)用緩存

在 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();
}
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容