纯自用,搬运请仔细辨别。
列表工具
统计元素出现次数
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;
}
统计列表元素总长度
int countListItemLength(List<String> list) {
return list.fold(0, (sum, content) => sum + content.length);
}
列表去重
List<T> toSetList<T>(List<T> list) {
return list.toSet().toList();
}
列表序列化
String listToString(List<String> list) {
return jsonEncode(list);
}
列表反序列化
List<String> stringToList(String jsonString) {
return jsonDecode(jsonString).cast<String>();
}
文件工具
删除文件
Future<bool> deleteFile(String path) async {
File file = File(path);
if (await file.exists()) {
await file.delete();
return true; // 返回删除成功
} else {
// 文件不存在,返回失败
return false;
}
}
删除文件夹
Future<void> deleteDir(String path) async {
Directory directory = Directory(path);
if (await directory.exists()) {
await directory.delete(recursive: true);
}
}
创建文件夹
Future<void> createDir(String path) async {
Directory directory = Directory(path);
await directory.create(recursive: true);
}
计算缓存大小
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};
}
}
清除缓存
Future<void> clearCache() async {
var cacheDir = await getApplicationCacheDirectory();
if (await cacheDir.exists()) {
await cacheDir.delete(recursive: true);
}
}
日志工具
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();
}
}
媒体工具
获取图片宽高
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;
}
获取图片比例
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;
}
弹窗工具
轻提示
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);
}
权限工具
申请权限
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;
}
}