import 'dart:io'; import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; class PhotoGroup { final String title; final int imageCount; final RxBool isSelected; final List images; final RxList selectedImages; int get selectedCount => selectedImages.where((selected) => selected).length; PhotoGroup({ required this.title, required this.imageCount, required bool isSelected, required this.images, }) : isSelected = isSelected.obs, selectedImages = List.generate(imageCount, (_) => isSelected).obs; void toggleSelectAll(bool value) { isSelected.value = value; selectedImages.assignAll(List.generate(images.length, (_) => value)); } } class SimilarPhotoController extends GetxController { final RxList photoGroups = [].obs; static final Map> _savedSelections = {}; static bool _hasInitializedSelections = false; int get selectedFileCount => photoGroups.fold(0, (sum, group) => sum + group.selectedCount); double get selectedFilesSize { double totalSize = 0; for (var group in photoGroups) { for (int i = 0; i < group.images.length; i++) { if (group.selectedImages[i]) { totalSize += File(group.images[i]).lengthSync(); } } } return totalSize / 1024; // Convert to KB } void toggleImageSelection(String groupTitle, int imageIndex) { final group = photoGroups.firstWhere((g) => g.title == groupTitle); group.selectedImages[imageIndex] = !group.selectedImages[imageIndex]; group.isSelected.value = group.selectedImages.every((selected) => selected); _saveSelections(); } void toggleGroupSelection(String groupTitle) { final group = photoGroups.firstWhere((g) => g.title == groupTitle); final newValue = !group.isSelected.value; group.toggleSelectAll(newValue); _saveSelections(); } void _saveSelections() { for (var group in photoGroups) { _savedSelections[group.title] = group.selectedImages.toList(); } _hasInitializedSelections = true; } void _restoreSelections() { for (var group in photoGroups) { // 这里假设每次页面加载时,已选择的状态会保存在 `RxList` 中。 group.isSelected.value = group.selectedImages.every((selected) => selected); } } @override void onInit() { super.onInit(); loadPhotosFromDirectory().then((_) { if (_hasInitializedSelections) { _restoreSelections(); } }); } Future loadPhotosFromDirectory() async { try { final Directory appDir = await getApplicationDocumentsDirectory(); final String photosPath = '${appDir.path}/photos'; final Directory photosDir = Directory(photosPath); if (!await photosDir.exists()) { return; } final List subDirs = await photosDir .list() .where((entity) => entity is Directory) .map((e) => e as Directory) .toList(); for (final dir in subDirs) { final List files = await dir .list() .where((entity) => entity is File && ['.jpg', '.jpeg', '.png'] .contains(p.extension(entity.path).toLowerCase())) .toList(); if (files.isNotEmpty) { photoGroups.add(PhotoGroup( title: 'photo: ${files.length}', imageCount: files.length, isSelected: false, images: files.map((file) => file.path).toList(), )); } } } catch (e) { print('Error loading photos: $e'); } } }