flutter 獲取應用快取以及清除快取

tabbin發表於2019-06-28

在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 協議》,轉載必須註明作者和本文連結

相關文章