在 Android 和 IOS 中埃碱,都有需要獲取應(yīng)用緩存和清除應(yīng)用緩存的功能,那么在 flutter 里面應(yīng)該怎么做呢酥泞?
獲取應(yīng)用緩存
要想獲取到應(yīng)用緩存砚殿,我們就必須找到用來裝緩存數(shù)據(jù)的文件夾,所以這里我們需要引入 path_provider , 用來獲取 Android 和 IOS 的緩存文件夾芝囤,然后再根據(jù)文件循環(huán)計算出緩存文件的大小似炎。
首先辛萍,我們先簡單介紹一下 path_provider 中獲取文件夾的方法:
getExternalStorageDirectory(); // 在iOS上,拋出異常羡藐,在Android上贩毕,這是getExternalStorageDirectory的返回值
getTemporaryDirectory(); // 在iOS上,對應(yīng)NSTemporaryDirectory()返回的值仆嗦,在Android上辉阶,這是getCacheDir的返回值。
getApplicationDocumentsDirectory(); // 在iOS上瘩扼,這對應(yīng)NSDocumentsDirectory谆甜,在Android上,這是AppData目錄
直到如何使用 path_provider 后集绰,我們正式開始:
1规辱、獲取緩存(加載緩存)
///加載緩存
Future<Null> 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、循環(huán)計算文件的大性匝唷(遞歸)
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];
}
清除緩存
通過 path_provider 得到緩存目錄,然后通過遞歸的方式碍岔,刪除里面所有的文件炫贤。
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();
}
}
}