| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import 'dart:io';
- import 'dart:isolate';
- import 'package:clean/utils/file_size_calculator_util.dart';
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/foundation.dart';
- import 'package:get/get.dart';
- import 'package:wechat_assets_picker/wechat_assets_picker.dart';
- import '../image_picker/image_picker_util.dart';
- class PhotoGroup {
- // 照片组的选择状态
- final RxBool isSelected;
- // 照片组中的图片列表
- final RxList<AssetEntity> images;
- // 每张图片的选择状态
- final RxList<bool> selectedImages;
- // 已选中图片的唯一标识集合
- final RxSet<String> selectedPhotosIds = <String>{}.obs;
- // 照片组的位置
- final String? location;
- // 选中文件的总大小
- RxDouble selectedTotalSize = 0.0.obs;
- // 照片组的月份
- final String? month;
- // 整个 images 列表的总大小
- RxDouble totalSize = 0.0.obs;
- // 获取已选中的图片数量
- int get selectedCount => selectedPhotosIds.length;
- // 构造函数
- PhotoGroup({
- required bool isSelected,
- required List<AssetEntity> images,
- this.location,
- this.month,
- }) : isSelected = isSelected.obs,
- images = images.obs,
- selectedImages = RxList<bool>.filled(images.length, isSelected) {
- // 初始化已选中图片的唯一标识集合
- if (isSelected) {
- selectedPhotosIds.addAll(images.map((e) => e.id).toList());
- }
- }
- Future<void> initTotalSize() async {
- await FileSizeCalculatorUtil.calculateTotalSize(
- assetIds: images.map((e) => e.id).toSet(), updateValue: (double totalSize) {
- this.totalSize.value = totalSize; // 监听并更新 UI
- });
- }
- // Future<void> _calculateTotalSize() async {
- // if (images.isEmpty) {
- // this.totalSize.value = 0;
- // return;
- // }
- // double totalSize = 0;
- // final uncasedIds = images
- // .map((e) => e.id)
- // .where((id) => !FileSizeCalculatorUtil.fileSizeCache.containsKey(id))
- // .toSet();
- //
- // // **1️⃣ 先处理缓存中的文件**
- // totalSize = images.fold(
- // 0,
- // (prev, image) =>
- // prev + (FileSizeCalculatorUtil.fileSizeCache[image.id] ?? 0));
- //
- // this.totalSize.value = totalSize;
- // // **2️⃣ 分批处理未缓存的文件**
- // const batchSize = 20;
- // for (int i = 0; i < uncasedIds.length; i += batchSize) {
- // if (images.isEmpty) {
- // this.totalSize.value = 0;
- // return;
- // }
- //
- // final batch = uncasedIds.skip(i).take(batchSize);
- // final sizes =
- // await Future.wait(batch.map(FileSizeCalculatorUtil.getFileSize));
- //
- // totalSize += sizes.fold(0, (sum, size) => sum + size);
- //
- // // **再检查一次是否被清空,避免无意义计算**
- // if (images.isEmpty) {
- // this.totalSize.value = 0;
- // return;
- // }
- //
- // await Future.delayed(Duration.zero);
- // }
- //
- // print("PhotoGroup $month _calculateTotalSize totalSize: $totalSize");
- // this.totalSize.value = totalSize; // 确保最终更新总大小
- // }
- // 切换选择所有图片的状态
- void toggleSelectAll(bool value) {
- isSelected.value = value;
- selectedImages.assignAll(List.filled(images.length, value));
- if (value) {
- selectedPhotosIds.addAll(images.map((e) => e.id).toList());
- } else {
- selectedPhotosIds.clear();
- }
- }
- /// 判断某张图片是否被选中
- bool isImageSelected(AssetEntity image) {
- return selectedPhotosIds.contains(image.id);
- }
- }
|