WallPaper_FSX_Flutter/lib/modules/wallpaper_det/wallpaper_det_controller.dart
fengshengxiong 9f361ce560 1.集成firebase
2.优化功能
2024-05-23 18:22:18 +08:00

170 lines
5.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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:hello_wallpaper/applovin_max/applovin_manage.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:hello_wallpaper/common/components/dialog/bottomsheet_dialog.dart';
import 'package:hello_wallpaper/common/components/easy_loading.dart';
import 'package:hello_wallpaper/common/storage/favorite_data.dart';
import 'package:hello_wallpaper/common/utils/device_info_util.dart';
import 'package:hello_wallpaper/common/utils/download_util.dart';
import 'package:hello_wallpaper/common/utils/local_path_util.dart';
import 'package:hello_wallpaper/common/utils/obj_util.dart';
import 'package:hello_wallpaper/common/utils/permission_util.dart';
import 'package:hello_wallpaper/common/utils/wallpaper_manage.dart';
import 'package:hello_wallpaper/models/wallpaper_model.dart';
import 'package:hello_wallpaper/modules/favorite/favorite_controller.dart';
class WallpaperDetController extends GetxController {
late final List<GlobalKey> globalKey;
late final List<WallpaperData> wallpaperList;
late final PageController pageController;
var blurs = <bool>[].obs;
var position = 0;
var filePath = '';
@override
void onInit() {
super.onInit();
position = Get.arguments['position'] ?? 0;
wallpaperList = Get.arguments['wallpaperList'] ?? <WallpaperData>[];
globalKey = List.generate(wallpaperList.length, (index) => GlobalKey());
blurs.value = List.generate(wallpaperList.length, (index) => false);
pageController = PageController(initialPage: position);
}
@override
void onClose() {
pageController.dispose();
super.onClose();
}
/// 图片切换
void onPageChanged(int index) {
position = index;
filePath = '';
}
/// 设置滤镜
void onTapBlur() {
blurs[position] = !blurs[position];
}
/// 下载
void onTapDownload() {
if (blurs[position]) {
// 若是模糊状态,直接捕获保存
_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>()) {
FavoriteController.to.getData();
}
}
toast('Wallpaper has been collected');
}
/// 设置壁纸
void onTapSetWallpaper() async {
await ApplovinManage().showAdIfReady(ApplovinManage().adUnitId2);
BottomSheetDialog.show((location) async {
if (blurs[position]) {
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<void> _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();
}
/// 显示广告
Future<void> showAd() async {
await ApplovinManage().showAdIfReady(ApplovinManage().adUnitId3);
Get.back();
}
}