纯自用,搬运请仔细辨别。

列表工具

统计元素出现次数

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;
  }
}