photo_selected_preview_controller.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import 'package:clean/base/base_controller.dart';
  2. import 'package:clean/base/base_photo_controller.dart';
  3. import 'package:clean/data/bean/photos_type.dart';
  4. import 'package:clean/data/repositories/user_repository.dart';
  5. import 'package:clean/dialog/photo_delete_finish_dialog.dart';
  6. import 'package:clean/dialog/photo_deleting_dialog.dart';
  7. import 'package:clean/handler/event_handler.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_controller.dart';
  11. import 'package:clean/module/store/store_view.dart';
  12. import 'package:clean/router/app_pages.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 '../people_photo/people_photo_controller.dart';
  20. import '../similar_photo/similar_photo_controller.dart';
  21. class PhotoSelectedPreviewController extends BasePhotoController {
  22. late PhotosType photosType;
  23. final RxBool isKeepAll = false.obs;
  24. final RxList<AssetEntity> selectedPhotos = <AssetEntity>[].obs;
  25. PhotoPreviewController photoPreviewController =
  26. Get.find<PhotoPreviewController>();
  27. @override
  28. void onInit() {
  29. _getArgs();
  30. super.onInit();
  31. }
  32. // 从参数中获取照片类型和选中的照片ID集合
  33. _getArgs() {
  34. final parameters = Get.arguments;
  35. photosType = parameters?['photosType'];
  36. selectedPhotosIds.assignAll(parameters?['selectedIds'] ?? []);
  37. }
  38. // 加载选中的照片预览
  39. @override
  40. void loadPhotos() {
  41. photoGroups.clear();
  42. for (var assetsEntity in photoPreviewController.listAssetEntity) {
  43. if (selectedPhotosIds.contains(assetsEntity.id)) {
  44. selectedPhotos.add(assetsEntity);
  45. }
  46. }
  47. if (selectedPhotos.isNotEmpty) {
  48. photoGroups.add(PhotoGroup(
  49. isSelected: true,
  50. images: selectedPhotos,
  51. ));
  52. }
  53. }
  54. void clickBack() {
  55. EventHandler.report(EventId.event_04007);
  56. print('PhotoSelectedPreviewController clickBack');
  57. photoPreviewController.updateSelections(selectedPhotosIds);
  58. // 注意:1
  59. // if (photosType == PhotosType.peoplePhotos) {
  60. // print(
  61. // 'PhotoSelectedPreviewController clickBack selectedPhotosIds $selectedPhotosIds');
  62. // PeoplePhotoController controller = Get.find<PeoplePhotoController>();
  63. // controller.updateSelections(selectedPhotosIds);
  64. // controller.restoreSelections();
  65. // } else if (photosType == PhotosType.similarPhotos) {
  66. // SimilarPhotoController controller = Get.find<SimilarPhotoController>();
  67. // controller.updateSelections(selectedPhotosIds);
  68. // controller.restoreSelections();
  69. // }
  70. Get.back();
  71. }
  72. @override
  73. clickImage(List<AssetEntity> images, int imageIndex, PhotosType type) {
  74. print("PhotoSelectedPreviewController clickImage");
  75. }
  76. @override
  77. void clickDelete() async {
  78. if (selectedPhotosIds.isEmpty) {
  79. ToastUtil.show('Please select the picture');
  80. return;
  81. }
  82. EventHandler.report(EventId.event_04006);
  83. if (userRepository.isVip()) {
  84. if (selectedPhotosIds.isNotEmpty) {
  85. photoDeletingDialog();
  86. print(
  87. "PhotoSelectedPreviewController clickDelete selectedPhotosIds $selectedPhotosIds");
  88. final assetsToDelete = photoGroups
  89. .expand((group) => group.images
  90. .where((asset) => selectedPhotosIds.contains(asset.id)))
  91. .toList();
  92. final List<String> result = await PhotoManager.editor.deleteWithIds(
  93. assetsToDelete.map((e) => e.id).toList(),
  94. );
  95. if (result.length == selectedPhotosIds.length) {
  96. for (var group in photoGroups) {
  97. group.images.removeWhere(
  98. (element) => selectedPhotosIds.contains(element.id));
  99. // 更新 group 中的 selectedPhotosIds 状态
  100. group.selectedPhotosIds.clear();
  101. for (var image in group.images) {
  102. if (selectedPhotosIds.contains(image.id)) {
  103. group.selectedPhotosIds.add(image.id);
  104. }
  105. }
  106. }
  107. photoPreviewController.selectedPhotosIds.assignAll(selectedPhotosIds);
  108. photoPreviewController.cleanSelections();
  109. ImagePickerUtil.updatePhotoGroupDate(
  110. getPhotosType(), selectedPhotosIds);
  111. selectedPhotosIds.clear();
  112. ToastUtil.show("Delete success");
  113. Future.delayed(Duration(seconds: 2), () {
  114. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  115. photoDeleteFinishDialog(onDismiss: () {
  116. Get.until((route) => Get.currentRoute == RoutePath.mainTab);
  117. });
  118. });
  119. } else {
  120. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  121. ToastUtil.show("Delete failed");
  122. }
  123. } else {
  124. EventHandler.report(EventId.event_04009);
  125. isKeepAll.value = true;
  126. Future.delayed(Duration(seconds: 3), () {
  127. Get.until((route) => Get.currentRoute == RoutePath.mainTab);
  128. });
  129. }
  130. } else {
  131. StorePage.start();
  132. }
  133. }
  134. @override
  135. void onClose() {
  136. // TODO: implement onClose
  137. super.onClose();
  138. isKeepAll.value = false;
  139. }
  140. @override
  141. PhotosType getPhotosType() => photosType;
  142. }