photo_group.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import 'dart:io';
  2. import 'dart:isolate';
  3. import 'package:clean/utils/file_size_calculator_util.dart';
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:get/get.dart';
  7. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  8. import '../image_picker/image_picker_util.dart';
  9. class PhotoGroup {
  10. // 照片组的选择状态
  11. final RxBool isSelected;
  12. // 照片组中的图片列表
  13. final RxList<AssetEntity> images;
  14. // 每张图片的选择状态
  15. final RxList<bool> selectedImages;
  16. // 已选中图片的唯一标识集合
  17. final RxSet<String> selectedPhotosIds = <String>{}.obs;
  18. // 照片组的位置
  19. final String? location;
  20. // 选中文件的总大小
  21. RxDouble selectedTotalSize = 0.0.obs;
  22. // 照片组的月份
  23. final String? month;
  24. // 整个 images 列表的总大小
  25. RxDouble totalSize = 0.0.obs;
  26. // 获取已选中的图片数量
  27. int get selectedCount => selectedPhotosIds.length;
  28. // 构造函数
  29. PhotoGroup({
  30. required bool isSelected,
  31. required List<AssetEntity> images,
  32. this.location,
  33. this.month,
  34. }) : isSelected = isSelected.obs,
  35. images = images.obs,
  36. selectedImages = RxList<bool>.filled(images.length, isSelected) {
  37. // 初始化已选中图片的唯一标识集合
  38. if (isSelected) {
  39. selectedPhotosIds.addAll(images.map((e) => e.id).toList());
  40. }
  41. }
  42. Future<void> initTotalSize() async {
  43. await FileSizeCalculatorUtil.calculateTotalSize(
  44. assetIds: images.map((e) => e.id).toSet(), updateValue: (double totalSize) {
  45. this.totalSize.value = totalSize; // 监听并更新 UI
  46. });
  47. }
  48. // Future<void> _calculateTotalSize() async {
  49. // if (images.isEmpty) {
  50. // this.totalSize.value = 0;
  51. // return;
  52. // }
  53. // double totalSize = 0;
  54. // final uncasedIds = images
  55. // .map((e) => e.id)
  56. // .where((id) => !FileSizeCalculatorUtil.fileSizeCache.containsKey(id))
  57. // .toSet();
  58. //
  59. // // **1️⃣ 先处理缓存中的文件**
  60. // totalSize = images.fold(
  61. // 0,
  62. // (prev, image) =>
  63. // prev + (FileSizeCalculatorUtil.fileSizeCache[image.id] ?? 0));
  64. //
  65. // this.totalSize.value = totalSize;
  66. // // **2️⃣ 分批处理未缓存的文件**
  67. // const batchSize = 20;
  68. // for (int i = 0; i < uncasedIds.length; i += batchSize) {
  69. // if (images.isEmpty) {
  70. // this.totalSize.value = 0;
  71. // return;
  72. // }
  73. //
  74. // final batch = uncasedIds.skip(i).take(batchSize);
  75. // final sizes =
  76. // await Future.wait(batch.map(FileSizeCalculatorUtil.getFileSize));
  77. //
  78. // totalSize += sizes.fold(0, (sum, size) => sum + size);
  79. //
  80. // // **再检查一次是否被清空,避免无意义计算**
  81. // if (images.isEmpty) {
  82. // this.totalSize.value = 0;
  83. // return;
  84. // }
  85. //
  86. // await Future.delayed(Duration.zero);
  87. // }
  88. //
  89. // print("PhotoGroup $month _calculateTotalSize totalSize: $totalSize");
  90. // this.totalSize.value = totalSize; // 确保最终更新总大小
  91. // }
  92. // 切换选择所有图片的状态
  93. void toggleSelectAll(bool value) {
  94. isSelected.value = value;
  95. selectedImages.assignAll(List.filled(images.length, value));
  96. if (value) {
  97. selectedPhotosIds.addAll(images.map((e) => e.id).toList());
  98. } else {
  99. selectedPhotosIds.clear();
  100. }
  101. }
  102. /// 判断某张图片是否被选中
  103. bool isImageSelected(AssetEntity image) {
  104. return selectedPhotosIds.contains(image.id);
  105. }
  106. }