Просмотр исходного кода

增加删除中,删除完成弹窗

云天逵 1 год назад
Родитель
Сommit
6a03226514

BIN
assets/images/icon_photo_deleting.webp


BIN
assets/images/icon_photo_preview_tip.webp


+ 18 - 0
lib/data/consts/constants.dart

@@ -0,0 +1,18 @@
+import 'package:clean/utils/mmkv_util.dart';
+
+class Constants {
+  Constants._();
+
+
+  static const String firstOpenPhotoPreview = 'firstOpenPhotoPreview';
+
+
+}
+bool isFirstOpenPhotoPreview() {
+  return KVUtil.getBool(Constants.firstOpenPhotoPreview, true);
+}
+void setFirstOpenPhotoPreview(bool firstTime) {
+  KVUtil.putBool(Constants.firstOpenPhotoPreview, firstTime);
+}
+
+

+ 107 - 0
lib/dialog/photo_delete_finish_dialog.dart

@@ -0,0 +1,107 @@
+import 'package:clean/module/main/main_view.dart';
+import 'package:clean/resource/assets.gen.dart';
+import 'package:clean/resource/colors.gen.dart';
+import 'package:flutter/Material.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:lottie/lottie.dart';
+import 'package:get/get.dart';
+import 'package:clean/router/app_pages.dart';
+
+void photoDeleteFinishDialog() {
+  const tag = 'photoDeleteFinishDialog';
+  // 300ms后关闭弹窗
+  Future.delayed(Duration(milliseconds: 1500), () {
+    SmartDialog.dismiss(tag: tag);
+    //   回到首页
+   MainTabPage.start();
+  });
+  SmartDialog.show(
+      tag: tag,
+      backType: SmartBackType.block,
+      clickMaskDismiss: false,
+      maskColor: ColorName.black,
+      builder: (_) {
+        return Container(
+          height: double.infinity,
+          width: double.infinity,
+          child: Stack(
+            children: [
+              Positioned(
+                  top: 176.h,
+                  left: 0,
+                  right: 0,
+                  child: Column(
+                    children: [
+                      Column(
+                        crossAxisAlignment: CrossAxisAlignment.center,
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        children: [
+                          Assets.images.iconPreviewSwiperEndFinish.image(
+                            width: 180.w,
+                            height: 180.w,
+                          ),
+                          Text(
+                            'Perfect!',
+                            textAlign: TextAlign.center,
+                            style: TextStyle(
+                              color: Colors.white,
+                              fontSize: 32.sp,
+                              fontWeight: FontWeight.w700,
+                            ),
+                          ),
+                          SizedBox(height: 16.h),
+                          SizedBox(
+                            child: Row(
+                              mainAxisAlignment: MainAxisAlignment.center,
+                              children: [
+                                Container(
+                                  clipBehavior: Clip.antiAlias,
+                                  decoration: BoxDecoration(),
+                                  child: Assets
+                                      .images.iconPreviewSwiperEndFirework
+                                      .image(
+                                    width: 40.w,
+                                    height: 40.w,
+                                  ),
+                                ),
+                                SizedBox(width: 4.w),
+                                Text(
+                                  'Photos Removed',
+                                  textAlign: TextAlign.center,
+                                  style: TextStyle(
+                                    color: Colors.white.withValues(alpha: 0.8),
+                                    fontSize: 16.sp,
+                                    fontWeight: FontWeight.w400,
+                                  ),
+                                ),
+                                SizedBox(width: 4.w),
+                                Container(
+                                  clipBehavior: Clip.antiAlias,
+                                  decoration: BoxDecoration(),
+                                  child: Assets
+                                      .images.iconPreviewSwiperEndFirework
+                                      .image(
+                                    width: 40.w,
+                                    height: 40.w,
+                                  ),
+                                ),
+                              ],
+                            ),
+                          ),
+                        ],
+                      ),
+                    ],
+                  )),
+              IgnorePointer(
+                child: Assets.images.bgPreviewSwiperEndFirework.image(
+                  width: 360.w,
+                  height: 234.h,
+                ),
+              ),
+            ],
+          ),
+        );
+      });
+}

+ 54 - 0
lib/dialog/photo_deleting_dialog.dart

@@ -0,0 +1,54 @@
+import 'package:clean/dialog/photo_delete_finish_dialog.dart';
+import 'package:clean/resource/assets.gen.dart';
+import 'package:clean/resource/colors.gen.dart';
+import 'package:flutter/Material.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:lottie/lottie.dart';
+
+void photoDeletingDialog() {
+  const tag = 'photoDeletingDialog';
+
+  SmartDialog.show(
+      tag: tag,
+      backType: SmartBackType.block,
+      clickMaskDismiss: false,
+      maskColor: ColorName.black,
+      builder: (_) {
+        return Container(
+          height: double.infinity,
+          width: double.infinity,
+          child: Stack(
+            children: [
+              Positioned(
+                top: 176.h,
+                left: 0,
+                right: 0,
+                child: Column(
+                  children: [
+                    Assets.images.iconPhotoDeleting
+                        .image(width: 273.w, height: 220.h),
+                    SizedBox(height: 45.h),
+                    Text(
+                      'Deleting...',
+                      style: TextStyle(
+                        color: ColorName.white,
+                        fontSize: 16.sp,
+                        fontWeight: FontWeight.w500,
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+              IgnorePointer(
+                child: Assets.images.bgHome.image(
+                  width: 360.w,
+                  height: 234.h,
+                ),
+              ),
+            ],
+          ),
+        );
+      });
+}

+ 57 - 0
lib/dialog/photo_preview_tip_dialog.dart

@@ -0,0 +1,57 @@
+import 'package:clean/resource/assets.gen.dart';
+import 'package:clean/resource/colors.gen.dart';
+import 'package:flutter/Material.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+
+void photoPreviewTipDialog({VoidCallback? clickCallback}) {
+  const tag = 'photoPreviewTipDialog';
+  SmartDialog.show(
+      tag: tag,
+      backType: SmartBackType.block,
+      clickMaskDismiss: false,
+      maskColor: ColorName.black70,
+      builder: (_) {
+        return SizedBox(
+          width: 360.w,
+          child: Column(
+
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+
+              Assets.images.iconPhotoPreviewTip
+                  .image(width: 360.w, height: 314.h),
+              SizedBox(height: 66.h),
+              GestureDetector(
+                onTap: () {
+                  clickCallback?.call();
+                  SmartDialog.dismiss(tag: tag);
+                },
+                child: Container(
+                  width: 134.w,
+                  height: 40.h,
+                  decoration: ShapeDecoration(
+                    color: Color(0xFF0279FB),
+                    shape: RoundedRectangleBorder(
+                      borderRadius: BorderRadius.circular(10.r),
+                    ),
+                  ),
+                  child: Center(
+                    child: Text(
+                      'Try Clean-up',
+                      textAlign: TextAlign.center,
+                      style: TextStyle(
+                        color: Colors.white,
+                        fontSize: 16.sp,
+                        fontWeight: FontWeight.w500,
+                      ),
+                    ),
+                  ),
+                ),
+              )
+            ],
+          ),
+        );
+      });
+}

+ 30 - 10
lib/module/photo_preview/photo_preview_controller.dart

@@ -2,6 +2,10 @@ import 'dart:async';
 
 import 'package:clean/base/base_controller.dart';
 import 'package:clean/data/bean/photos_type.dart';
+import 'package:clean/data/consts/constants.dart';
+import 'package:clean/dialog/photo_delete_finish_dialog.dart';
+import 'package:clean/dialog/photo_deleting_dialog.dart';
+import 'package:clean/dialog/photo_preview_tip_dialog.dart';
 import 'package:clean/module/image_picker/image_picker_util.dart';
 import 'package:clean/module/locations_photo/locations_single_photo_controller.dart';
 import 'package:clean/module/people_photo/people_photo_controller.dart';
@@ -50,6 +54,18 @@ class PhotoPreviewController extends BaseController {
     });
   }
 
+  @override
+  void onReady() {
+    // TODO: implement onReady
+    super.onReady();
+
+    if (isFirstOpenPhotoPreview()) {
+      photoPreviewTipDialog(clickCallback: () {
+        setFirstOpenPhotoPreview(false);
+      });
+    }
+  }
+
   // 获取参数
   void _getArgs() {
     photosType = parameters?['photosType'];
@@ -101,15 +117,14 @@ class PhotoPreviewController extends BaseController {
   }
 
   void restoreSelections() async {
-
-    photoGroups.removeWhere((element) => selectedPhotosIds.contains(element.id));
+    photoGroups
+        .removeWhere((element) => selectedPhotosIds.contains(element.id));
     selectedPhotosIds.clear();
     if (photoGroups.isNotEmpty) {
       WidgetsBinding.instance.addPostFrameCallback((_) {
         groupIndex.value = 0;
         cardSwiperController.value.moveTo(0);
       });
-
     }
     updateSelectedFilesSize();
     selectedFileCount.value = selectedPhotosIds.length;
@@ -256,6 +271,7 @@ class PhotoPreviewController extends BaseController {
 
   clickDelete() async {
     print('clickDelete');
+
     switch (photosType) {
       case PhotosType.peoplePhotos:
         ImagePickerUtil.selectedPeoplePhotosIds.assignAll(selectedPhotosIds);
@@ -293,34 +309,38 @@ class PhotoPreviewController extends BaseController {
       if (result.length == selectedPhotosIds.length) {
         switch (photosType) {
           case PhotosType.peoplePhotos:
-            ImagePickerUtil.updatePhotoGroupDate(photosType,ImagePickerUtil.selectedPeoplePhotosIds);
+            ImagePickerUtil.updatePhotoGroupDate(
+                photosType, ImagePickerUtil.selectedPeoplePhotosIds);
 
             break;
           case PhotosType.screenshots:
-            ImagePickerUtil.updatePhotoGroupDate(photosType,ImagePickerUtil.selectedScreenshotPhotosIds);
+            ImagePickerUtil.updatePhotoGroupDate(
+                photosType, ImagePickerUtil.selectedScreenshotPhotosIds);
 
             break;
           case PhotosType.similarPhotos:
-            ImagePickerUtil.updatePhotoGroupDate(photosType,ImagePickerUtil.selectedSimilarPhotosIds);
+            ImagePickerUtil.updatePhotoGroupDate(
+                photosType, ImagePickerUtil.selectedSimilarPhotosIds);
 
             break;
           case PhotosType.locationPhotos:
-            ImagePickerUtil.updatePhotoGroupDate(photosType,ImagePickerUtil.selectedLocationPhotosIds);
+            ImagePickerUtil.updatePhotoGroupDate(
+                photosType, ImagePickerUtil.selectedLocationPhotosIds);
 
             break;
           case PhotosType.blurryPhotos:
-            ImagePickerUtil.updatePhotoGroupDate(photosType,ImagePickerUtil.selectedBlurryPhotosIds);
+            ImagePickerUtil.updatePhotoGroupDate(
+                photosType, ImagePickerUtil.selectedBlurryPhotosIds);
 
             break;
         }
 
         restoreSelections();
+  
       } else {
         // 删除失败
         ToastUtil.show("Delete failed");
       }
     }
   }
-
-
 }

+ 6 - 2
lib/module/photo_preview/photo_preview_view.dart

@@ -271,12 +271,16 @@ class PhotoPreviewPage extends BasePage<PhotoPreviewController> {
   Widget onSwiperEndCard() {
     return Column(
       children: [
-        Spacer(),
+        Spacer(flex: 3,),
         Center(
           child: Column(
             crossAxisAlignment: CrossAxisAlignment.center,
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
+              Assets.images.iconPreviewSwiperEndFinish.image(
+                width: 180.w,
+                height: 180.w,
+              ),
               Text(
                 'Perfect!',
                 textAlign: TextAlign.center,
@@ -324,7 +328,7 @@ class PhotoPreviewPage extends BasePage<PhotoPreviewController> {
             ],
           ),
         ),
-        Spacer(),
+        Spacer(flex: 5,),
         controller.photoGroups.isEmpty ? SizedBox() : _bottomBarCard(),
       ],
     );

+ 18 - 1
lib/module/photo_preview/photo_selected_preview_controller.dart

@@ -1,10 +1,13 @@
 import 'package:clean/base/base_controller.dart';
 import 'package:clean/data/bean/photos_type.dart';
+import 'package:clean/dialog/photo_delete_finish_dialog.dart';
+import 'package:clean/dialog/photo_deleting_dialog.dart';
 import 'package:clean/module/image_picker/image_picker_util.dart';
 import 'package:clean/module/people_photo/photo_group.dart';
 import 'package:clean/module/photo_preview/photo_preview_controller.dart';
 import 'package:clean/utils/toast_util.dart';
 import 'package:flutter/Material.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
 import 'package:wechat_assets_picker/wechat_assets_picker.dart';
 
@@ -78,6 +81,8 @@ class PhotoSelectedPreviewController extends BaseController {
 
   clickDelete() async {
     print('clickDelete');
+    photoDeletingDialog();
+
     switch (photosType) {
       case PhotosType.peoplePhotos:
         ImagePickerUtil.selectedPeoplePhotosIds.assignAll(selectedPhotosIds);
@@ -95,6 +100,7 @@ class PhotoSelectedPreviewController extends BaseController {
       case PhotosType.blurryPhotos:
         ImagePickerUtil.selectedBlurryPhotosIds.assignAll(selectedPhotosIds);
         break;
+
     }
     if (selectedPhotosIds.isNotEmpty) {
       final assetsToDelete = photoGroups
@@ -143,8 +149,19 @@ class PhotoSelectedPreviewController extends BaseController {
         selectedPhotosIds.clear();
 
         restoreSelections();
+
+        Future.delayed(Duration(seconds: 3), () {
+          SmartDialog.dismiss(tag: 'photoDeletingDialog');
+          photoDeleteFinishDialog();
+        });
+
+
       } else {
-        // 删除失败
+
+        Future.delayed(Duration(seconds: 3), () {
+          SmartDialog.dismiss(tag: 'photoDeletingDialog');
+        });
+
         ToastUtil.show("Delete failed");
       }
     }