在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<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、迴圈計算檔案的大小(遞迴)
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: '清除快取成功');
}
///遞迴方式刪除目錄
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 file.delete();
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結