similar_photo_controller.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'dart:io';
  2. import 'package:clean/base/base_controller.dart';
  3. import 'package:clean/base/base_photo_controller.dart';
  4. import 'package:clean/data/bean/photos_type.dart';
  5. import 'package:clean/data/repositories/user_repository.dart';
  6. import 'package:clean/dialog/photo_delete_finish_dialog.dart';
  7. import 'package:clean/dialog/photo_deleting_dialog.dart';
  8. import 'package:clean/module/image_picker/image_picker_util.dart';
  9. import 'package:clean/module/people_photo/photo_group.dart';
  10. import 'package:clean/module/photo_preview/photo_preview_view.dart';
  11. import 'package:clean/module/store/store_view.dart';
  12. import 'package:clean/utils/toast_util.dart';
  13. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  14. import 'package:get/get.dart';
  15. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  16. class SimilarPhotoController extends BasePhotoController {
  17. @override
  18. void loadPhotos() {
  19. photoGroups.clear();
  20. photoGroups.addAll(
  21. ImagePickerUtil.similarPhotos.where((group) => group.isNotEmpty).map(
  22. (group) {
  23. return PhotoGroup(
  24. isSelected: true,
  25. images: group,
  26. );
  27. },
  28. ),
  29. );
  30. for (var group in photoGroups) {
  31. for (int i = 0; i < group.images.length; i++) {
  32. group.selectedImages[i] = i == 0 ? false : true;
  33. updateSelectedPhotosIds(group.images[i].id, i != 0);
  34. }
  35. }
  36. ImagePickerUtil.selectedSimilarPhotosIds.assignAll(selectedPhotosIds);
  37. }
  38. // 点击删除单组选中的图片
  39. void clickSingleGroupDelete(List<AssetEntity> images) async {
  40. if (userRepository.isVip()) {
  41. // 获取指定组
  42. final group = getGroupByImages(images);
  43. // 获取该组中所有选中的图片
  44. final selectedImages = group.images
  45. .where((image) => group.selectedImages[group.images.indexOf(image)])
  46. .toList();
  47. if (selectedImages.isEmpty) {
  48. ToastUtil.show('Please select the photo to delete');
  49. return;
  50. }
  51. photoDeletingDialog();
  52. try {
  53. // 执行删除操作
  54. final List<String> result = await PhotoManager.editor.deleteWithIds(
  55. selectedImages.map((e) => e.id).toList(),
  56. );
  57. // 检查删除成功的图片数量
  58. if (result.length == selectedImages.length) {
  59. // 先删除该组的图片,再更新selectedImages和selectedPhotosIds
  60. List<AssetEntity> imagesToRemove = [];
  61. List<int> indexesToRemove = [];
  62. for (var image in selectedImages) {
  63. // 找到图片在该组中的索引
  64. int index = group.images.indexOf(image);
  65. imagesToRemove.add(image);
  66. indexesToRemove.add(index);
  67. }
  68. // 从后往前删除,避免删除后索引错位
  69. for (int i = indexesToRemove.length - 1; i >= 0; i--) {
  70. int index = indexesToRemove[i];
  71. group.images.removeAt(index);
  72. group.selectedImages.removeAt(index);
  73. }
  74. // 如果当前组为空,则删除该组
  75. if (group.images.isEmpty) {
  76. photoGroups.remove(group);
  77. }
  78. // 更新选中的图片ID
  79. for (var image in imagesToRemove) {
  80. updateSelectedPhotosIds(image.id, false);
  81. }
  82. selectedFileCount.value = selectedPhotosIds.length;
  83. updateSelectedFilesSize();
  84. Future.delayed(Duration(seconds: 2), () {
  85. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  86. photoDeleteFinishDialog();
  87. });
  88. ToastUtil.show("Delete success");
  89. } else {
  90. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  91. ToastUtil.show("Delete failed");
  92. }
  93. } catch (e) {
  94. // 异常处理
  95. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  96. ToastUtil.show("Error occurred during deletion: $e");
  97. }
  98. } else {
  99. StorePage.start();
  100. }
  101. }
  102. @override
  103. PhotosType getPhotosType() => PhotosType.similarPhotos;
  104. }