diff --git a/lib/common/widgets/overlay_pop.dart b/lib/common/widgets/overlay_pop.dart index 9bd4a407..71fcec6e 100644 --- a/lib/common/widgets/overlay_pop.dart +++ b/lib/common/widgets/overlay_pop.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:PiliPalaX/grpc/app/card/v1/card.pb.dart' as card; +import 'package:PiliPalaX/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../utils/download.dart'; @@ -80,11 +81,17 @@ class OverlayPop extends StatelessWidget { onPressed: () async { await DownloadUtils.downloadImg( context, - videoItem is card.Card - ? (videoItem as card.Card).smallCoverV5.base.cover - : (videoItem.pic != null - ? videoItem.pic as String - : videoItem.cover as String), + [ + videoItem is card.Card + ? (videoItem as card.Card) + .smallCoverV5 + .base + .cover + .http2https + : (videoItem.pic != null + ? (videoItem.pic as String).http2https + : (videoItem.cover as String).http2https) + ], ); closeFn!(); }, diff --git a/lib/pages/preview/view.dart b/lib/pages/preview/view.dart index 24760246..0ed9a910 100644 --- a/lib/pages/preview/view.dart +++ b/lib/pages/preview/view.dart @@ -94,11 +94,25 @@ class _ImagePreviewState extends State onTap: () { Get.back(); DownloadUtils.downloadImg( - context, _previewController.currentImgUrl); + context, + [_previewController.currentImgUrl], + ); }, dense: true, title: const Text('保存到手机', style: TextStyle(fontSize: 14)), ), + if (imgList!.length > 1) + ListTile( + onTap: () { + Get.back(); + DownloadUtils.downloadImg( + context, + imgList!, + ); + }, + dense: true, + title: const Text('保存全部到手机', style: TextStyle(fontSize: 14)), + ), ], ), ); diff --git a/lib/utils/download.dart b/lib/utils/download.dart index 5e37ef97..3c3302b3 100644 --- a/lib/utils/download.dart +++ b/lib/utils/download.dart @@ -1,5 +1,6 @@ import 'dart:typed_data'; +import 'package:PiliPalaX/http/index.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; @@ -69,7 +70,8 @@ class DownloadUtils { } } - static Future checkPermissionDependOnSdkInt(BuildContext context) async { + static Future checkPermissionDependOnSdkInt( + BuildContext context) async { if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt <= 32) { @@ -81,39 +83,52 @@ class DownloadUtils { } return await requestStoragePer(context); } - static Future downloadImg(BuildContext context, String imgUrl, - {String imgType = 'cover'}) async { + + static Future downloadImg( + BuildContext context, + List imgList, { + String imgType = 'cover', + }) async { try { if (!await checkPermissionDependOnSdkInt(context)) { - // // return false; + return; } - SmartDialog.showLoading(msg: '正在下载原图'); - var response = await Dio() - .get(imgUrl, options: Options(responseType: ResponseType.bytes)); - SmartDialog.dismiss(); - SmartDialog.showLoading(msg: '正在保存图片至图库'); - String picName = - "${imgType}_${DateTime.now().toString().replaceAll(' ', '_').replaceAll(':', '-').split('.').first}"; - final SaveResult result = await SaverGallery.saveImage( - Uint8List.fromList(response.data), - quality: 100, - name: picName, - fileExtension: 'jpg', - // 保存到 PiliPalaX文件夹 - androidRelativePath: "Pictures/PiliPalaX", - androidExistNotSave: false, - ); - SmartDialog.dismiss(); - if (result.isSuccess) { - await SmartDialog.showToast('「$picName」已保存 '); - } else { - await SmartDialog.showToast('保存失败,${result.errorMessage}'); + Dio dio = Dio() + ..options = BaseOptions( + connectTimeout: const Duration(milliseconds: 10000), + receiveTimeout: const Duration(milliseconds: 10000), + ); + for (int i = 0; i < imgList.length; i++) { + SmartDialog.showLoading( + msg: + '正在下载原图${imgList.length > 1 ? '${i + 1}/${imgList.length}' : ''}'); + var response = await dio.get(imgList[i], + options: Options(responseType: ResponseType.bytes)); + String picName = + "${imgType}_${DateTime.now().toString().replaceAll(' ', '_').replaceAll(':', '-').split('.').first}"; + final SaveResult result = await SaverGallery.saveImage( + Uint8List.fromList(response.data), + quality: 100, + name: picName, + fileExtension: 'jpg', + // 保存到 PiliPalaX文件夹 + androidRelativePath: "Pictures/PiliPalaX", + androidExistNotSave: false, + ); + // SmartDialog.dismiss(); + // SmartDialog.showLoading(msg: '正在保存图片至图库'); + if (i == imgList.length - 1) { + SmartDialog.dismiss(); + } + if (result.isSuccess) { + await SmartDialog.showToast('「$picName」已保存 '); + } else { + await SmartDialog.showToast('保存失败,${result.errorMessage}'); + } } - return true; } catch (err) { SmartDialog.dismiss(); SmartDialog.showToast(err.toString()); - return true; } } }