similar_photo_controller.dart 4.7 KB

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