Browse Source

新增缓存控制

gavin.chen 1 year ago
parent
commit
d52a116e1b

+ 139 - 0
lib/managers/cache.dart

@@ -0,0 +1,139 @@
+import 'dart:io';
+
+import 'package:path_provider/path_provider.dart';
+import 'package:vitalapp/managers/interfaces/cache.dart';
+
+class CacheManager implements ICacheManager {
+  /// 清理文件缓存(全部)
+  @override
+  void clearApplicationCache() async {
+    Directory docDirectory = await getApplicationDocumentsDirectory();
+    Directory tempDirectory = await getTemporaryDirectory();
+
+    if (docDirectory.existsSync()) {
+      await deleteDirectory(docDirectory);
+    }
+
+    if (tempDirectory.existsSync()) {
+      await deleteDirectory(tempDirectory);
+    }
+  }
+
+  @override
+  void clearApplicationImageCache() async {
+    Directory tempDirectory = await getTemporaryDirectory();
+    if (tempDirectory.existsSync()) {
+      await deleteImageDirectory(tempDirectory);
+    }
+  }
+
+  /// 清理单个文件
+  @override
+  Future<void> deleteDirectory(FileSystemEntity file) async {
+    if (file is Directory) {
+      final List<FileSystemEntity> children = file.listSync();
+      for (final FileSystemEntity child in children) {
+        await deleteDirectory(child);
+        await child.delete();
+      }
+    }
+  }
+
+  /// 递归清理图像
+  Future<void> deleteImageDirectory(FileSystemEntity file) async {
+    if (file is File) {
+      if (file.path.endsWith('.png') ||
+          file.path.endsWith('.jpg') ||
+          file.path.endsWith('.jpeg') ||
+          file.path.endsWith('.mp4') ||
+          file.path.endsWith('.avi') ||
+          file.path.endsWith('.mov')) {
+        await file.delete();
+      }
+    }
+    if (file is Directory) {
+      final List<FileSystemEntity> children = file.listSync();
+      for (final FileSystemEntity child in children) {
+        await deleteImageDirectory(child);
+      }
+    }
+  }
+
+  /// 获取缓存文件大小
+  @override
+  Future<double> getCacheSize() async {
+    //获取文件夹
+    Directory docDirectory = await getApplicationDocumentsDirectory();
+    Directory tempDirectory = await getTemporaryDirectory();
+
+    double size = 0;
+
+    if (docDirectory.existsSync()) {
+      size += await getTotalSizeOfFilesInDir(docDirectory);
+    }
+    if (tempDirectory.existsSync()) {
+      size += await getTotalSizeOfFilesInDir(tempDirectory);
+    }
+    return size;
+  }
+
+  @override
+  Future<double> getImageCacheSize() async {
+    //获取文件夹
+    Directory docDirectory = await getApplicationDocumentsDirectory();
+    Directory tempDirectory = await getTemporaryDirectory();
+
+    double size = 0;
+
+    if (docDirectory.existsSync()) {
+      size += await getTotalSizeOfImageInDir(docDirectory);
+    }
+    if (tempDirectory.existsSync()) {
+      size += await getTotalSizeOfImageInDir(tempDirectory);
+    }
+    return size;
+  }
+
+  static 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;
+      for (final FileSystemEntity child in children) {
+        total += await getTotalSizeOfFilesInDir(child);
+      }
+      return total;
+    }
+    return 0;
+  }
+
+  static Future<double> getTotalSizeOfImageInDir(
+      final FileSystemEntity file) async {
+    if (file is File) {
+      if (file.path.endsWith('.png') ||
+          file.path.endsWith('.jpg') ||
+          file.path.endsWith('.jpeg') ||
+          file.path.endsWith('.mp4') ||
+          file.path.endsWith('.avi') ||
+          file.path.endsWith('.mov')) {
+        int length = await file.length();
+        return double.parse(length.toString());
+      } else {
+        return 0;
+      }
+    }
+    if (file is Directory) {
+      final List<FileSystemEntity> children = file.listSync();
+      double total = 0;
+      for (final FileSystemEntity child in children) {
+        total += await getTotalSizeOfImageInDir(child);
+      }
+      return total;
+    }
+    return 0;
+  }
+}

+ 3 - 0
lib/managers/index.dart

@@ -36,7 +36,9 @@ import 'package:vitalapp/managers/service_pack.dart';
 import 'package:vitalapp/managers/system_setting.dart';
 import 'package:vitalapp/managers/template.dart';
 import 'package:vitalapp/managers/upgrade.dart';
+import 'cache.dart';
 import 'interfaces/base.dart';
+import 'interfaces/cache.dart';
 import 'interfaces/contract_template.dart';
 
 abstract class ManagerCenter {
@@ -58,6 +60,7 @@ abstract class ManagerCenter {
     Get.put<ICachedRecordManager>(CachedRecordManager());
     Get.put<IDiagnosisManager>(DiagnosisManager());
     Get.put<IDictionaryManager>(DictionaryManager());
+    Get.put<ICacheManager>(CacheManager());
 
     Get.put<IDataSyncManager>(DataSyncManager());
     Get.put<IUpgradeManager>(UpgradeManager());

+ 20 - 0
lib/managers/interfaces/cache.dart

@@ -0,0 +1,20 @@
+import 'package:file/file.dart';
+import 'base.dart';
+
+/// 缓存文件管理-Android
+abstract class ICacheManager implements IManager {
+  /// 清理文件缓存(全部)
+  void clearApplicationCache();
+
+  /// 清理图像缓存(全部)
+  void clearApplicationImageCache();
+
+  /// 清理单个文件
+  Future<void> deleteDirectory(FileSystemEntity file);
+
+  /// 获取缓存文件大小
+  Future<double> getCacheSize();
+
+  /// 获取缓存图像大小
+  Future<double> getImageCacheSize();
+}

+ 24 - 3
lib/pages/facial_recognition/controller.dart

@@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
 import 'package:get/get.dart';
 import 'package:image_gallery_saver/image_gallery_saver.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
+import 'package:vitalapp/managers/interfaces/cache.dart';
 
 import 'index.dart';
 
@@ -170,9 +171,6 @@ class FacialRecognitionController extends GetxController
     } else {
       for (CameraDescription cameraDescription in _cameras) {
         if (cameraDescription.lensDirection == CameraLensDirection.back) {
-          if (cameraDescription.name == '0') {
-            continue;
-          }
           await onNewCameraSelected(cameraDescription);
           lockCaptureOrientation();
           update();
@@ -225,6 +223,26 @@ class FacialRecognitionController extends GetxController
     }
   }
 
+  /// 测试图像文件缓存,print 遍历输出
+  void debugShowCache() async {
+    final cacheManager = Get.find<ICacheManager>();
+    double cacheSize = await cacheManager.getCacheSize();
+    print('cacheSize = $cacheSize : ${formatSize(cacheSize)}');
+    double imageCacheSize = await cacheManager.getImageCacheSize();
+    print('imageCacheSize = $imageCacheSize : ${formatSize(imageCacheSize)}');
+  }
+
+  static String formatSize(double value) {
+    List<String> unitArr = ['B', 'K', 'M', 'G'];
+    int index = 0;
+    while (value > 1024) {
+      index++;
+      value = value / 1024;
+    }
+    String size = value.toStringAsFixed(2);
+    return size + unitArr[index];
+  }
+
   void saveImageToGallery(XFile image) async {
     // 获取图像的字节数据
     Uint8List bytes = await image.readAsBytes();
@@ -237,11 +255,14 @@ class FacialRecognitionController extends GetxController
 
   /// 发生拍摄事件
   void onTakePictureButtonPressed() {
+    // debugShowCache();
+
     takePicture().then((XFile? file) {
       // imageFile = file;
       if (file != null) {
         PromptBox.toast('已临时保存到相册');
         print('Picture saved to ${file.path}');
+        debugShowCache();
       }
     });
   }