import 'dart:io'; import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:now_wallpaper/common/components/dialog/bottomsheet_dialog.dart'; import 'package:now_wallpaper/common/components/easy_loading.dart'; import 'package:now_wallpaper/common/storage/favorite_data.dart'; import 'package:now_wallpaper/common/utils/device_info_util.dart'; import 'package:now_wallpaper/common/utils/download_util.dart'; import 'package:now_wallpaper/common/utils/local_path_util.dart'; import 'package:now_wallpaper/common/utils/obj_util.dart'; import 'package:now_wallpaper/common/utils/permission_util.dart'; import 'package:now_wallpaper/common/utils/wallpaper_manage.dart'; import 'package:now_wallpaper/models/wallpaper_model.dart'; import 'package:now_wallpaper/modules/favorite/favorite_controller.dart'; class WallpaperDetController extends GetxController { late final List globalKey; late final PageController pageController; late final List wallpaperList; var position = 0; var showBlur = false.obs; var filePath = ''; @override void onInit() { super.onInit(); position = Get.arguments['position'] ?? 0; wallpaperList = Get.arguments['wallpaperList'] ?? []; globalKey = List.generate(wallpaperList.length, (index) => GlobalKey()); pageController = PageController(initialPage: position); } /// 图片切换 void onPageChanged(int index) { position = index; filePath = ''; showBlur.value = false; } /// 设置滤镜 void onTapBlur() { showBlur.value = !showBlur.value; } /// 下载 void onTapDownload() { if (showBlur.value) { // 若是模糊状态,直接捕获保存 _captureScreenshot(); return; } if (Get.isSnackbarOpen) { return; } DownloadUtil.downloadFile('${wallpaperList[position].original}', (savePath) async { filePath = savePath; bool canSave = true; if (Platform.isAndroid) { // 在Android 10及以上版本,由于引入了分区存储(Scoped Storage)机制,如果应用只是需要访问媒体文件,而不是整个外部存储 // ImageGallerySaver使用MediaStore API来添加图片到相册,无需请求存储权限 // Android 10以下版本,需要申请存储权限 int sdkVersion = await DeviceInfoUtil.getAndroidSystemVersion(); if (sdkVersion < 29) { bool status = await PermissionUtil.checkPermission([Permission.storage]); canSave = status; } } if (canSave) { final result = await ImageGallerySaver.saveFile(savePath); if (result['isSuccess']) { toast('Saved to album'); } else { toast('Unable to save to album'); } } }); } /// 收藏 void onTapFavorite() { WallpaperData wallpaperData = wallpaperList[position]; // 未收藏过的才保存 if (FavoriteData().getWallpaperData().firstWhereOrNull((element) => element.original == wallpaperData.original) == null) { FavoriteData().setWallpaperData(wallpaperData); // 刷新收藏列表 if (Get.isRegistered()) { FavoriteController.to.getData(); } } toast('Wallpaper has been collected'); } /// 设置壁纸 void onTapSetWallpaper() async { BottomSheetDialog.show((location) async { if (showBlur.value) { await _captureScreenshot(); } else { if (ObjUtil.isNotEmptyStr(filePath)) { WallpaperManage.setWallpaper(filePath, location); } else { DownloadUtil.downloadFile('${wallpaperList[position].original}', (savePath) async { filePath = savePath; WallpaperManage.setWallpaper(filePath, location); }); } } }); } Future _captureScreenshot() async { loading(); try { if (globalKey[position].currentContext != null) { if (globalKey[position].currentContext!.findRenderObject() != null) { RenderObject boundary = globalKey[position].currentContext!.findRenderObject()!; RenderRepaintBoundary repaintBoundary = boundary as RenderRepaintBoundary; ui.Image image = await repaintBoundary.toImage(); ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); if (byteData != null) { Uint8List? pngBytes = byteData.buffer.asUint8List(); Directory dir = await LocalPathUtil.getTemporaryPath(); bool exist = await dir.exists(); if (!exist) { // 若目录不存在,先创建 await dir.create(); } final imagePath = '${dir.path}/${DateTime.now().millisecondsSinceEpoch}.jpg'; File imageFile = File(imagePath); await imageFile.writeAsBytes(pngBytes); filePath = imagePath; final result = await ImageGallerySaver.saveImage(pngBytes); if (result['isSuccess']) { toast('Saved to album'); } else { toast('Unable to save to album'); } } } } } catch (e) { toast('Unable to save to album'); } dismiss(); } }