flutter 获取应用缓存以及清除缓存

Flutter获取应用缓存,及清理应用缓存

在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 协议》,转载必须注明作者和本文链接
讨论数量: 2

兄嘚,文件夹的移动和复制怎么搞???

4年前 评论

楼主试了一下android是可以的 但是ios会报错 errno1和errno66

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!