Loading... 纯自用,搬运请仔细辨别。 ## 列表工具 ### 统计元素出现次数 ```dart Map<T, int> countList<T>(List<T> list) { Map<T, int> counts = {}; for (var item in list) { counts[item] = counts.containsKey(item) ? counts[item]! + 1 : 1; } return counts; } ``` ### 统计列表元素总长度 ```dart int countListItemLength(List<String> list) { return list.fold(0, (sum, content) => sum + content.length); } ``` ### 列表去重 ```dart List<T> toSetList<T>(List<T> list) { return list.toSet().toList(); } ``` ### 列表序列化 ```dart String listToString(List<String> list) { return jsonEncode(list); } ``` ### 列表反序列化 ```dart List<String> stringToList(String jsonString) { return jsonDecode(jsonString).cast<String>(); } ``` ## 文件工具 ### 删除文件 ```dart Future<bool> deleteFile(String path) async { File file = File(path); if (await file.exists()) { await file.delete(); return true; // 返回删除成功 } else { // 文件不存在,返回失败 return false; } } ``` ### 删除文件夹 ```dart Future<void> deleteDir(String path) async { Directory directory = Directory(path); if (await directory.exists()) { await directory.delete(recursive: true); } } ``` ### 创建文件夹 ```dart Future<void> createDir(String path) async { Directory directory = Directory(path); await directory.create(recursive: true); } ``` ### 计算缓存大小 ```dart Future<Map<String, dynamic>> countSize() async { var cacheDir = await getApplicationCacheDirectory(); var bytes = 0; var fileList = cacheDir.listSync(recursive: true); // 计算文件总大小(字节) for (var file in fileList) { if (file is File) { bytes += file.lengthSync(); } } // 根据文件总大小选择合适的单位 return bytesToUnits(bytes); } Map<String, dynamic> bytesToUnits(int bytes) { // 根据文件总大小选择合适的单位 if (bytes < 1024) { return {'size': bytes.toString(), 'unit': 'B', 'bytes': bytes}; } else if (bytes < 1024 * 1024) { return {'size': (bytes / 1024).toStringAsFixed(2), 'unit': 'KB', 'bytes': bytes}; } else if (bytes < 1024 * 1024 * 1024) { return {'size': (bytes / (1024 * 1024)).toStringAsFixed(2), 'unit': 'MB', 'bytes': bytes}; } else { return {'size': (bytes / (1024 * 1024 * 1024)).toStringAsFixed(2), 'unit': 'GB', 'bytes': bytes}; } } ``` ### 清除缓存 ```dart Future<void> clearCache() async { var cacheDir = await getApplicationCacheDirectory(); if (await cacheDir.exists()) { await cacheDir.delete(recursive: true); } } ``` ## 日志工具 ```dart void printError(message, {required Object error, StackTrace? stackTrace}) { if (kDebugMode) { var logger = Logger(); logger.e(message, error: error, stackTrace: stackTrace); logger.close(); } } void printWTF(message, {required Object error, StackTrace? stackTrace}) { if (kDebugMode) { var logger = Logger(); logger.f(message, error: error, stackTrace: stackTrace); logger.close(); } } void printInfo(message) { if (kDebugMode) { var logger = Logger(); logger.i(message); logger.close(); } } ``` ## 媒体工具 ### 获取图片宽高 ```dart Future<Size> getImageSize(ImageProvider imageProvider) async { final Completer<Size> completer = Completer<Size>(); final ImageStream stream = imageProvider.resolve(const ImageConfiguration()); stream.addListener( ImageStreamListener( (ImageInfo info, bool _) { final Size size = Size(info.image.width.toDouble(), info.image.height.toDouble()); completer.complete(size); }, ), ); return completer.future; } ``` ### 获取图片比例 ```dart Future<double> getImageAspectRatio(ImageProvider imageProvider) async { final Completer<double> completer = Completer<double>(); final ImageStream stream = imageProvider.resolve(const ImageConfiguration()); stream.addListener( ImageStreamListener( (ImageInfo info, bool _) { final double aspectRatio = info.image.width.toDouble() / info.image.height.toDouble(); completer.complete(aspectRatio); }, ), ); return completer.future; } ``` ## 弹窗工具 ### 轻提示 ```dart void showToast(String message) async { final colorScheme = Theme.of(Get.context!).colorScheme; Fluttertoast.cancel(); Fluttertoast.showToast( msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.SNACKBAR, timeInSecForIosWeb: 1, backgroundColor: colorScheme.secondaryContainer, textColor: colorScheme.onSecondaryContainer, fontSize: 16.0); } ``` ## 权限工具 ### 申请权限 ```dart Future<bool> checkPermission(Permission permission) async { //检查当前权限 final status = await permission.status; //如果还没有授权或者拒绝过 if (status.isDenied) { //尝试申请权限 final permissionStatus = await permission.request(); if (permissionStatus.isDenied || permissionStatus.isPermanentlyDenied) { Utils().noticeUtil.showToast('请授予相关权限'); return false; } else { return true; } } else if (status.isPermanentlyDenied) { Utils().noticeUtil.showToast('相关权限被禁用,请去设置中手动开启'); Future.delayed(const Duration(seconds: 2), () => openAppSettings()); return false; } else { return true; } } ``` © 允许规范转载 打赏 赞赏作者 微信 赞 1