From 1ee2758756c7d74b1c51d5be84384e174e80deff Mon Sep 17 00:00:00 2001 From: Mark M2 Macbook Date: Sat, 9 May 2026 11:07:38 +0200 Subject: [PATCH] Improve camera image processing with overlay and error handling --- .../shared_forms/mobile_upload_screen.dart | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/core/widgets/shared_forms/mobile_upload_screen.dart b/lib/core/widgets/shared_forms/mobile_upload_screen.dart index 258bea7..6f448fc 100644 --- a/lib/core/widgets/shared_forms/mobile_upload_screen.dart +++ b/lib/core/widgets/shared_forms/mobile_upload_screen.dart @@ -276,23 +276,41 @@ class _SharedMobileUploadScreenState extends State { // --- LOGICA FOTOCAMERA E LIBRERIA --- Future _handleCamera() async { final picker = ImagePicker(); + // Apriamo la fotocamera. Qui NON mettiamo il loader perché + // l'utente sta guardando l'app nativa del telefono. final photo = await picker.pickImage( source: ImageSource.camera, imageQuality: 80, ); - if (photo != null) { - final photoBytes = await photo.readAsBytes(); - final photoSize = await photo.length(); - final platformFile = PlatformFile( - name: photo.name, - size: photoSize, - path: photo.path, - bytes: photoBytes, // I bytes ci salvano la vita su Supabase! - ); - setState(() { - _stagedFiles.add(platformFile); - }); + if (photo != null) { + // 1. Accendiamo l'overlay "Elaborazione foto..." + setState(() => _isProcessingLocal = true); + + // 2. TRUCCO NINJA: Lasciamo "respirare" Flutter per 50ms + // in modo che faccia in tempo a disegnare l'overlay grigio sullo schermo + // prima che readAsBytes() blocchi il processore! + await Future.delayed(const Duration(milliseconds: 50)); + + try { + // 3. Ora facciamo il lavoro pesante + final photoBytes = await photo.readAsBytes(); + final photoSize = await photo.length(); + + final platformFile = PlatformFile( + name: photo.name, + size: photoSize, + path: photo.path, + bytes: photoBytes, + ); + + setState(() { + _stagedFiles.add(platformFile); + }); + } finally { + // 4. Spegniamo l'overlay, sia che vada a buon fine, sia che ci sia un errore + setState(() => _isProcessingLocal = false); + } } }