Flutter 计算App应用缓存及清除应用缓存

整体思路

  • 通过 path_provider插件获取getTemporaryDirectory路径
  • 循环计算文件的大小(递归)
  • 递归方式删除目录
  • 计算大小
  • 渲染

1.计算App应用缓存

 

import 'dart:io';
import 'package:path_provider/path_provider.dart';

  // 加载缓存
  Future<String> 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());
    return  _renderSize(value);
  }
  
  // 循环计算文件的大小(递归)
  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;
  }
  // 递归方式删除目录
  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();
  }
  // 计算大小
  _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);
    if (size ==  '0.00'){
      return '0M';
    }
    // print('size:${size == 0}\n ==SIZE${size}');
    return size + unitArr[index];
  }

2.清除App缓存

 

/// 清理缓存
///
void _clearCache() async {
    Directory tempDir = await getTemporaryDirectory();
    //删除缓存目录
    await _delDir(tempDir);
    await loadCache();
    Toast.show('清除缓存成功');
}

3.渲染文字(使用)

 

 String _cacheSizeStr = '0';
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getCount();
  }
  void getCount() async{
    _cacheSizeStr  = await loadCache();
    print('===cacheSize大小:${_cacheSizeStr}');
    setState(() {

    });
  }

补充

1.清理和获取图片缓存

 

 /// 清理内存:
  //clear all of image  in memory
  void clearMemoryImageCache() {
    PaintingBinding.instance.imageCache.clear();
  }

  // get ImageCache
  void getMemoryImageCache() {
    PaintingBinding.instance.imageCache;
  }

注意

Future<String> 要想获取其中的内容,前面必须+await 才可以,否则会报错



作者:StevenHu_Sir
链接:https://www.jianshu.com/p/5809bdb38062
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter清除缓存可以通过以下步骤实现[^1]: 1. 导入`path_provider`包: ```dart import 'package:path_provider/path_provider.dart'; ``` 2. 获取缓存目录: ```dart Directory cacheDir = await getTemporaryDirectory(); ``` 3. 计算缓存大小: ```dart int cacheSize = 0; List<FileSystemEntity> files = cacheDir.listSync(recursive: true); for (FileSystemEntity file in files) { if (file is File) { cacheSize += await file.length(); } } ``` 4. 删除缓存文件: ```dart for (FileSystemEntity file in files) { if (file is File) { await file.delete(recursive: true); } } ``` 下面是一个完整的示例代码: ```dart import 'dart:io'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Cache Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Flutter Cache Demo'), ), body: Center( child: RaisedButton( child: Text('Clear Cache'), onPressed: () async { Directory cacheDir = await getTemporaryDirectory(); int cacheSize = 0; List<FileSystemEntity> files = cacheDir.listSync(recursive: true); for (FileSystemEntity file in files) { if (file is File) { cacheSize += await file.length(); } } for (FileSystemEntity file in files) { if (file is File) { await file.delete(recursive: true); } } showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text('Cache Cleared'), content: Text('Cache size: ${cacheSize ~/ 1024} KB'), actions: <Widget>[ FlatButton( child: Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); }, ), ), ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值