fix supabase storage

This commit is contained in:
2026-04-20 16:50:55 +02:00
parent 8dc1c661ed
commit de940cea1f
10 changed files with 172 additions and 100 deletions

View File

@@ -1,11 +1,19 @@
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:pdfx/pdfx.dart';
import 'package:internet_file/internet_file.dart'; // flutter pub add internet_file
import 'package:internet_file/internet_file.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class PdfViewerWidget extends StatefulWidget {
final String url;
final String? storagePath;
final Uint8List? bytes;
const PdfViewerWidget({super.key, required this.url});
const PdfViewerWidget({super.key, this.storagePath, this.bytes})
: assert(
(storagePath != null && storagePath != '') || bytes != null,
'Errore: Devi fornire un URL valido o i bytes del file!',
);
@override
State<PdfViewerWidget> createState() => _PdfViewerWidgetState();
@@ -14,6 +22,7 @@ class PdfViewerWidget extends StatefulWidget {
class _PdfViewerWidgetState extends State<PdfViewerWidget> {
late PdfControllerPinch _pdfController;
bool _isLoading = true;
String? _errorMessage;
@override
void initState() {
@@ -22,12 +31,37 @@ class _PdfViewerWidgetState extends State<PdfViewerWidget> {
}
Future<void> _initPdf() async {
// Scarica il file in memoria in modo fluido
final pdfData = await InternetFile.get(widget.url);
_pdfController = PdfControllerPinch(
document: PdfDocument.openData(pdfData),
);
if (mounted) setState(() => _isLoading = false);
try {
Uint8List pdfData;
if (widget.bytes != null) {
// SCENARIO 1: Pratica in bozza, file appena scelto (Locale)
pdfData = widget.bytes!;
} else if (widget.storagePath != null && widget.storagePath!.isNotEmpty) {
// SCENARIO 2: Pratica salvata, scarichiamo da Supabase (Remoto)
final signedUrl = await GetIt.I
.get<SupabaseClient>()
.storage
.from('documents')
.createSignedUrl(widget.storagePath!, 60);
pdfData = await InternetFile.get(signedUrl);
} else {
throw Exception("Nessun documento trovato");
}
_pdfController = PdfControllerPinch(
document: PdfDocument.openData(pdfData),
);
if (mounted) setState(() => _isLoading = false);
} catch (e) {
if (mounted) {
setState(() {
_isLoading = false;
_errorMessage = e.toString();
});
}
}
}
@override
@@ -39,21 +73,25 @@ class _PdfViewerWidgetState extends State<PdfViewerWidget> {
@override
Widget build(BuildContext context) {
if (_isLoading) {
return const Center(child: CircularProgressIndicator());
return const Scaffold(body: Center(child: CircularProgressIndicator()));
}
if (_errorMessage != null) {
return Scaffold(
appBar: AppBar(leading: const CloseButton()),
body: Center(child: Text("Errore: $_errorMessage")),
);
}
return Scaffold(
// Usiamo Scaffold dentro il Dialog per avere l'AppBar e poter chiudere
appBar: AppBar(
title: const Text("Visualizzatore PDF"),
title: const Text("Anteprima PDF"),
leading: IconButton(
icon: const Icon(Icons.close),
onPressed: () => Navigator.pop(context),
),
),
body: PdfViewPinch(
controller: _pdfController,
// pdfx gestisce nativamente il pinch to zoom!
),
body: PdfViewPinch(controller: _pdfController),
);
}
}