pickFiles method
Implementation
Future<void> pickFiles() async {
if (isViewScreen.value) return;
var result = kIsWeb ? await FilePicker.platform.pickFiles(
allowMultiple: true,
withData: true,
) : await FilePicker.platform.pickFiles(
allowMultiple: true,
withData: false,
);
if (result == null || result.files.isEmpty) return;
const int maxFileSize = 50 * 1024 * 1024;
final validFiles = <PlatformFile>[];
final skippedFiles = <String>[];
for (var file in result.files) {
if (file.size <= maxFileSize) {
validFiles.add(file);
} else {
skippedFiles.add(file.name);
}
}
if (skippedFiles.isNotEmpty) {
AppUtils.showSnackBar(
'This file exceed 50MB and were not uploaded: ${skippedFiles.join(", ")}',
);
}
if (validFiles.isEmpty) {
uploadStatus.value = 'All files are too large.';
return;
}
int totalSize = validFiles.fold(0, (sum, file) => sum + file.size);
if (totalSize > maxFileSize) {
AppUtils.showSnackBar(
'Total file size exceeds 50MB. Please select fewer files.',
);
return;
}
isLoading.value = true;
uploadStatus.value = 'Uploading...';
try {
List fileData;
if (kIsWeb) {
fileData = validFiles.map((f) => f.bytes!).toList();
} else {
fileData = validFiles.map((f) => f.path!).toList();
}
final fileNames = validFiles.map((f) => f.name).toList();
var response = await apiService.uploadFileList(
fileData,
fileNames,
{
'createdBy': context.createdBy,
'FileTypeId': context.fileTypeId,
'moduleId': context.moduleId,
},
);
if (response.statusCode == 200) {
List<dynamic> uploadedData = response.data['data']['Result'];
for (var item in uploadedData) {
files.add(
AddonsFunDetails(
createdBy: context.createdBy,
funRefVal: item['Path'].toString(),
isActive: 1,
addOnType: 'Files',
),
);
}
uploadStatus.value = 'Upload successful';
} else {
uploadStatus.value = 'Upload failed';
}
} catch (e) {
uploadStatus.value = 'Error: $e';
} finally {
isLoading.value = false;
}
}