From 26a24b0e41e58705bda34e20d5fedaebd1beddf7 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 18 Nov 2025 13:06:08 +0800 Subject: [PATCH] :sparkles: Pdf viewer zoom --- lib/widgets/content/file_viewer_contents.dart | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/widgets/content/file_viewer_contents.dart b/lib/widgets/content/file_viewer_contents.dart index 62c68980..bab95851 100644 --- a/lib/widgets/content/file_viewer_contents.dart +++ b/lib/widgets/content/file_viewer_contents.dart @@ -35,6 +35,12 @@ class PdfFileContent extends HookConsumerWidget { [uri], ); + final pdfController = useMemoized(() => PdfViewerController(), []); + + final shadow = [ + Shadow(color: Colors.black54, blurRadius: 5.0, offset: Offset(1.0, 1.0)), + ]; + return FutureBuilder( future: fileFuture, builder: (context, snapshot) { @@ -43,7 +49,41 @@ class PdfFileContent extends HookConsumerWidget { } else if (snapshot.hasError) { return Center(child: Text('Error loading PDF: ${snapshot.error}')); } else if (snapshot.hasData) { - return SfPdfViewer.file(snapshot.data!); + return Stack( + children: [ + SfPdfViewer.file(snapshot.data!, controller: pdfController), + // Controls overlay + Positioned( + bottom: MediaQuery.of(context).padding.bottom + 16, + left: 16, + right: 16, + child: Row( + children: [ + IconButton( + icon: Icon( + Icons.remove, + color: Colors.white, + shadows: shadow, + ), + onPressed: () { + pdfController.zoomLevel = pdfController.zoomLevel * 0.9; + }, + ), + IconButton( + icon: Icon( + Icons.add, + color: Colors.white, + shadows: shadow, + ), + onPressed: () { + pdfController.zoomLevel = pdfController.zoomLevel * 1.1; + }, + ), + ], + ), + ), + ], + ); } return const Center(child: Text('No PDF data')); },