|
|
@@ -71,43 +71,47 @@ class CalendarSelectedPreviewController extends BaseController {
|
|
|
clickDelete() async {
|
|
|
debugPrint('CalendarSelectedPreviewController clickDelete');
|
|
|
if (userRepository.isVip()) {
|
|
|
-
|
|
|
- if (photoGroup.value.selectedPhotosIds.isNotEmpty) {
|
|
|
- photoDeletingDialog();
|
|
|
- // 获取要删除的资产
|
|
|
- final assetsToDelete = photoGroup.value.images
|
|
|
- .where(
|
|
|
- (asset) => photoGroup.value.selectedPhotosIds.contains(asset.id),
|
|
|
- )
|
|
|
- .toList();
|
|
|
-
|
|
|
- // 调用方法会返回被删除的资源,如果全部失败会返回空列表。
|
|
|
- final List<String> result = await PhotoManager.editor.deleteWithIds(
|
|
|
- assetsToDelete.map((e) => e.id).toList(),
|
|
|
- );
|
|
|
-
|
|
|
- // 比较result和selectedPhotosIds,如果result和selectedPhotosIds相等,说明删除成功,走下面的逻辑
|
|
|
- // 如果不相等,说明有删除失败的,走else逻辑
|
|
|
- if (result.length == photoGroup.value.selectedPhotosIds.length) {
|
|
|
- debugPrint(
|
|
|
- "CalendarSelectedPreviewController delete ${photoGroup.value.selectedPhotosIds}");
|
|
|
-
|
|
|
- ImagePickerUtil.updatePhotoData(photoGroup.value.selectedPhotosIds);
|
|
|
- cleanSelections();
|
|
|
- ToastUtil.show('Delete success');
|
|
|
- Future.delayed(Duration(seconds: 2), () {
|
|
|
- SmartDialog.dismiss(tag: 'photoDeletingDialog');
|
|
|
- photoDeleteFinishDialog(onDismiss: () {
|
|
|
- Get.until((route) => Get.currentRoute == RoutePath.mainTab);
|
|
|
+ if (photoGroup.value.selectedPhotosIds.isNotEmpty) {
|
|
|
+ photoDeletingDialog();
|
|
|
+ // 获取要删除的资产
|
|
|
+ final assetsToDelete = photoGroup.value.images
|
|
|
+ .where(
|
|
|
+ (asset) => photoGroup.value.selectedPhotosIds.contains(asset.id),
|
|
|
+ )
|
|
|
+ .toList();
|
|
|
+
|
|
|
+ // 调用方法会返回被删除的资源,如果全部失败会返回空列表。
|
|
|
+ final List<String> result = await PhotoManager.editor.deleteWithIds(
|
|
|
+ assetsToDelete.map((e) => e.id).toList(),
|
|
|
+ );
|
|
|
+
|
|
|
+ // 比较result和selectedPhotosIds,如果result和selectedPhotosIds相等,说明删除成功,走下面的逻辑
|
|
|
+ // 如果不相等,说明有删除失败的,走else逻辑
|
|
|
+ if (result.length == photoGroup.value.selectedPhotosIds.length) {
|
|
|
+ debugPrint(
|
|
|
+ "CalendarSelectedPreviewController delete ${photoGroup.value.selectedPhotosIds}");
|
|
|
+
|
|
|
+ ImagePickerUtil.updatePhotoData(photoGroup.value.selectedPhotosIds);
|
|
|
+ cleanSelections();
|
|
|
+ ToastUtil.show('Delete success');
|
|
|
+ Future.delayed(Duration(seconds: 2), () {
|
|
|
+ SmartDialog.dismiss(tag: 'photoDeletingDialog');
|
|
|
+ photoDeleteFinishDialog(onDismiss: () {
|
|
|
+ Get.until((route) => Get.currentRoute == RoutePath.mainTab);
|
|
|
+ });
|
|
|
});
|
|
|
+ } else {
|
|
|
+ SmartDialog.dismiss(tag: 'photoDeletingDialog');
|
|
|
+ // 删除失败
|
|
|
+ ToastUtil.show("Delete failed");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ isKeepAll.value = true;
|
|
|
|
|
|
+ Future.delayed(Duration(seconds: 3), () {
|
|
|
+ Get.until((route) => Get.currentRoute == RoutePath.mainTab);
|
|
|
});
|
|
|
- } else {
|
|
|
- SmartDialog.dismiss(tag: 'photoDeletingDialog');
|
|
|
- // 删除失败
|
|
|
- ToastUtil.show("Delete failed");
|
|
|
}
|
|
|
- }
|
|
|
} else {
|
|
|
StorePage.start();
|
|
|
}
|
|
|
@@ -134,49 +138,14 @@ class CalendarSelectedPreviewController extends BaseController {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- double totalSize = 0;
|
|
|
- final uncasedIds = photoGroup.value.selectedPhotosIds
|
|
|
- .where((id) => !FileSizeCalculatorUtil.fileSizeCache.containsKey(id))
|
|
|
- .toSet();
|
|
|
-
|
|
|
- // **1️⃣ 先处理缓存中的文件**
|
|
|
-
|
|
|
- totalSize = photoGroup.value.selectedPhotosIds
|
|
|
- .fold(0, (prev, id) => prev + (FileSizeCalculatorUtil.fileSizeCache[id] ?? 0));
|
|
|
-
|
|
|
- // **2️⃣ 分批处理未缓存的文件**
|
|
|
- const batchSize = 50;
|
|
|
- for (int i = 0; i < uncasedIds.length; i += batchSize) {
|
|
|
- if (photoGroup.value.selectedPhotosIds.isEmpty) {
|
|
|
- photoGroup.value.selectedTotalSize.value = 0;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- final batch = uncasedIds.skip(i).take(batchSize);
|
|
|
- final sizes = await Future.wait(batch.map(FileSizeCalculatorUtil.getFileSize));
|
|
|
-
|
|
|
- totalSize += sizes.fold(0, (sum, size) => sum + size);
|
|
|
-
|
|
|
- // **再检查一次是否被清空,避免无意义计算**
|
|
|
- if (photoGroup.value.selectedPhotosIds.isEmpty) {
|
|
|
- photoGroup.value.selectedTotalSize.value = 0;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // **减少 UI 更新频率**
|
|
|
- if (i % (batchSize * 2) == 0 || i + batchSize >= uncasedIds.length) {
|
|
|
+ FileSizeCalculatorUtil.calculateTotalSize(
|
|
|
+ assetIds: photoGroup.value.selectedPhotosIds,
|
|
|
+ updateValue: (double totalSize) {
|
|
|
photoGroup.value.selectedTotalSize.value = totalSize;
|
|
|
- }
|
|
|
-
|
|
|
- await Future.delayed(Duration.zero);
|
|
|
- }
|
|
|
-
|
|
|
- photoGroup.value.selectedTotalSize.value = totalSize; // 确保最终更新总大小
|
|
|
- PhotoManager.clearFileCache();
|
|
|
+ },
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
void updateSelectedPhotosIds(String photoId, bool isSelected) {
|
|
|
if (isSelected) {
|
|
|
if (!photoGroup.value.selectedPhotosIds.contains(photoId)) {
|
|
|
@@ -208,16 +177,17 @@ class CalendarSelectedPreviewController extends BaseController {
|
|
|
|
|
|
// 将selectedFilesSize转成String类型,然后单位转换,如果超过1MB,则转成MB,超过1GB,则转成GB,否则KB
|
|
|
String get selectedFilesSizeString {
|
|
|
-
|
|
|
final double sizeInKB = photoGroup.value.selectedTotalSize.value;
|
|
|
|
|
|
- if (sizeInKB >= 1024 * 1024) { // 先检查最大单位(GB)
|
|
|
+ if (sizeInKB >= 1024 * 1024) {
|
|
|
+ // 先检查最大单位(GB)
|
|
|
return "${(sizeInKB / (1024 * 1024)).toStringAsFixed(2)}GB";
|
|
|
- } else if (sizeInKB >= 1024) { // 然后检查MB
|
|
|
+ } else if (sizeInKB >= 1024) {
|
|
|
+ // 然后检查MB
|
|
|
return "${(sizeInKB / 1024).toStringAsFixed(2)}MB";
|
|
|
- } else { // 最后是KB
|
|
|
+ } else {
|
|
|
+ // 最后是KB
|
|
|
return "${sizeInKB.toStringAsFixed(2)}KB";
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|