前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutte 缓存清除

Flutte 缓存清除

原创
作者头像
派大星在吗
发布2021-12-15 15:24:53
5.5K0
发布2021-12-15 15:24:53
举报
文章被收录于专栏:我的技术专刊

定义缓存管理类

缓存管理类,是一个简单的缓存管理封装,他通过几个接口共 APP 组件使用。

该类需要使用到以下依赖:

首先建立缓存管理类,并规划好一个大纲:

代码语言:txt
复制
/// 缓存管理类
代码语言:txt
复制
/// ./lib/utils/cache_util.dart
代码语言:txt
复制
class CacheUtil {
代码语言:txt
复制
  /// 获取缓存大小
代码语言:txt
复制
  static Future<int> total() async {}
代码语言:txt
复制
  /// 清除缓存
代码语言:txt
复制
  static Future<int> clear() async {}
代码语言:txt
复制
  /// 递归缓存目录,计算缓存大小
代码语言:txt
复制
  static Future<int> _reduce() async {}
代码语言:txt
复制
  /// 递归删除缓存目录和文件
代码语言:txt
复制
  static Future<int> _delete() async {}
代码语言:txt
复制
}

获取缓存大小

获取缓存大小,需要递归处理计算缓存目录下的文件大小。

代码语言:txt
复制
/// 获取缓存大小
代码语言:txt
复制
static Future<int> total() async {
代码语言:txt
复制
  Directory tempDir = await getTemporaryDirectory();
代码语言:txt
复制
  if (tempDir == null) return 0;
代码语言:txt
复制
  int total = await _reduce(tempDir);
代码语言:txt
复制
  return total;
代码语言:txt
复制
}

递归计算缓存目录:

代码语言:txt
复制
/// 递归缓存目录,计算缓存大小
代码语言:txt
复制
static Future<int> _reduce(final FileSystemEntity file) async {
代码语言:txt
复制
  /// 如果是一个文件,则直接返回文件大小
代码语言:txt
复制
  if (file is File) {
代码语言:txt
复制
    int length = await file.length();
代码语言:txt
复制
    return length;
代码语言:txt
复制
  }
代码语言:txt
复制
  /// 如果是目录,则遍历目录并累计大小
代码语言:txt
复制
  if (file is Directory) {
代码语言:txt
复制
    final List<FileSystemEntity> children = file.listSync();
代码语言:txt
复制
    int total = 0;
代码语言:txt
复制
    if (children != null && children.isNotEmpty)
代码语言:txt
复制
      for (final FileSystemEntity child in children)
代码语言:txt
复制
        total += await _reduce(child);
代码语言:txt
复制
    return total;
代码语言:txt
复制
  }
代码语言:txt
复制
  return 0;
代码语言:txt
复制
}

清除缓存

和递归获取缓存目录下的文件大小类似,清除缓存就是遍历删除缓存目录下的文件:

代码语言:txt
复制
/// 清除缓存
代码语言:txt
复制
static Future<void> clear() async {
代码语言:txt
复制
  Directory tempDir = await getTemporaryDirectory();
代码语言:txt
复制
  if (tempDir == null) return;
代码语言:txt
复制
  await _delete(tempDir);
代码语言:txt
复制
}

递归清除缓存目录:

代码语言:txt
复制
/// 递归删除缓存目录和文件
代码语言:txt
复制
static Future<void> _delete(FileSystemEntity file) async {
代码语言:txt
复制
  if (file is Directory) {
代码语言:txt
复制
    final List<FileSystemEntity> children = file.listSync();
代码语言:txt
复制
    for (final FileSystemEntity child in children) {
代码语言:txt
复制
      await _delete(child);
代码语言:txt
复制
    }
代码语言:txt
复制
  } else {
代码语言:txt
复制
    await file.delete();
代码语言:txt
复制
  }
代码语言:txt
复制
}

完整代码

完整代码如下:

代码语言:txt
复制
import 'dart:io';
代码语言:txt
复制
import 'package:path_provider/path_provider.dart';
代码语言:txt
复制
/// 缓存管理类
代码语言:txt
复制
/// ./lib/utils/cache_util.dart
代码语言:txt
复制
class CacheUtil {
代码语言:txt
复制
  /// 获取缓存大小
代码语言:txt
复制
  static Future<int> total() async {
代码语言:txt
复制
    Directory tempDir = await getTemporaryDirectory();
代码语言:txt
复制
    if (tempDir == null) return 0;
代码语言:txt
复制
    int total = await _reduce(tempDir);
代码语言:txt
复制
    return total;
代码语言:txt
复制
  }
代码语言:txt
复制
  /// 清除缓存
代码语言:txt
复制
  static Future<void> clear() async {
代码语言:txt
复制
    Directory tempDir = await getTemporaryDirectory();
代码语言:txt
复制
    if (tempDir == null) return;
代码语言:txt
复制
    await _delete(tempDir);
代码语言:txt
复制
  }
代码语言:txt
复制
  /// 递归缓存目录,计算缓存大小
代码语言:txt
复制
  static Future<int> _reduce(final FileSystemEntity file) async {
代码语言:txt
复制
    /// 如果是一个文件,则直接返回文件大小
代码语言:txt
复制
    if (file is File) {
代码语言:txt
复制
      int length = await file.length();
代码语言:txt
复制
      return length;
代码语言:txt
复制
    }
代码语言:txt
复制
    /// 如果是目录,则遍历目录并累计大小
代码语言:txt
复制
    if (file is Directory) {
代码语言:txt
复制
      final List<FileSystemEntity> children = file.listSync();
代码语言:txt
复制
      int total = 0;
代码语言:txt
复制
      if (children != null && children.isNotEmpty)
代码语言:txt
复制
        for (final FileSystemEntity child in children)
代码语言:txt
复制
          total += await _reduce(child);
代码语言:txt
复制
      return total;
代码语言:txt
复制
    }
代码语言:txt
复制
    return 0;
代码语言:txt
复制
  }
代码语言:txt
复制
  /// 递归删除缓存目录和文件
代码语言:txt
复制
  static Future<void> _delete(FileSystemEntity file) async {
代码语言:txt
复制
    if (file is Directory) {
代码语言:txt
复制
      final List<FileSystemEntity> children = file.listSync();
代码语言:txt
复制
      for (final FileSystemEntity child in children) {
代码语言:txt
复制
        await _delete(child);
代码语言:txt
复制
      }
代码语言:txt
复制
    } else {
代码语言:txt
复制
      await file.delete();
代码语言:txt
复制
    }
代码语言:txt
复制
  }
代码语言:txt
复制
}

应用实战

实战中,我们添加 filesize(https://links.jianshu.com/go?to=https%3A%2F%2Fpub.flutter-

io.cn%2Fpackages%2Ffilesize) 依赖用来友好显示文件尺寸。使用 ValueNotifier

ValueListenableBuilder 更新界面。实现过程如下:

  • 定义一个 cacheSizeValueNotifier<int> cacheSize = ValueNotifier(0);
  • 定义一个 initCache 异步方法,用来刷新缓存,在 initStat 和 清除缓存 时调用,已实现实时刷新。
  • 定义一个 清除缓存 的方法,用来调用清除缓存和刷新缓存。

Simulator Screen Shot - iPhone 11 - 2021-03-27 at 13.06.05.png

缓存展示组件

代码语言:txt
复制
ValueListenableBuilder(
代码语言:txt
复制
  valueListenable: cacheSize,
代码语言:txt
复制
  builder: (BuildContext context, int size, Widget _) {
代码语言:txt
复制
    return Tile(
代码语言:txt
复制
      title: Text('本地缓存'),
代码语言:txt
复制
      titleSub: Text('点击清除缓存,但不会清除已下载的歌曲'),
代码语言:txt
复制
      detail: size != null && size > 0 ? filesize(size) : '',
代码语言:txt
复制
      action: SizedBox(width: 16),
代码语言:txt
复制
      onPressed: handleClearCache,
代码语言:txt
复制
    );
代码语言:txt
复制
  },
代码语言:txt
复制
)

初始化缓存方法

代码语言:txt
复制
Future<void> initCache() async {
代码语言:txt
复制
  /// 获取缓存大小
代码语言:txt
复制
  int size = await CacheUtil.total();
代码语言:txt
复制
  /// 复制变量
代码语言:txt
复制
  cacheSize.value = size ?? 0;
代码语言:txt
复制
}

清除缓存方法

代码语言:txt
复制
Future<void> handleClearCache() async {
代码语言:txt
复制
  try {
代码语言:txt
复制
    if (cacheSize.value <= 0) throw '没有缓存可清理';
代码语言:txt
复制
    /// 给予适当的提示
代码语言:txt
复制
    /// bool confirm = await showDialog();
代码语言:txt
复制
    /// if (confirm != true) return;
代码语言:txt
复制
    /// 执行清除缓存
代码语言:txt
复制
    await CacheUtil.clear();
代码语言:txt
复制
    /// 更新缓存
代码语言:txt
复制
    await initCache();
代码语言:txt
复制
    AppUtil.showToast('缓存清除成功');
代码语言:txt
复制
  } catch (e) {
代码语言:txt
复制
    AppUtil.showToast(e);
代码语言:txt
复制
  }
代码语言:txt
复制
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义缓存管理类
  • 获取缓存大小
  • 清除缓存
  • 完整代码
  • 应用实战
    • 缓存展示组件
      • 初始化缓存方法
        • 清除缓存方法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档