pdf rendering issue fix

This commit is contained in:
Surendiran 2026-02-05 11:33:55 +05:30
parent ab55141a17
commit 038b178a3c
2 changed files with 47 additions and 49 deletions

File diff suppressed because one or more lines are too long

View File

@ -21,7 +21,6 @@ class PolicyPdfViewer extends StatefulWidget {
class _PolicyPdfViewerState extends State<PolicyPdfViewer> { class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
Uint8List? _pdfBytes; Uint8List? _pdfBytes;
String? _loadedUrl;
final TransformationController _transformController = final TransformationController _transformController =
TransformationController(); TransformationController();
@ -32,33 +31,41 @@ class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
final ScrollController _scrollController = ScrollController(); final ScrollController _scrollController = ScrollController();
Future<void> _loadPdf() async { @override
if (_pdfBytes != null && _loadedUrl == widget.pdfUrl) return; void initState() {
super.initState();
final response = await http.get(Uri.parse(widget.pdfUrl!)); _loadPdf();
if (response.statusCode == 200) {
// setState(() {
_pdfBytes = response.bodyBytes;
_loadedUrl = widget.pdfUrl;
// });
}
} }
void _applyTransform() { Future<void> _loadPdf() async {
_transformController.value = Matrix4.identity()..scale(_scale); if (widget.pdfUrl == null) return;
try {
final response = await http.get(Uri.parse(widget.pdfUrl!));
if (!mounted) return;
if (response.statusCode == 200) {
setState(() {
_pdfBytes = response.bodyBytes; // MUST use setState
});
}
} catch (e) {
debugPrint('PDF load error: $e');
}
} }
void _zoomIn() { void _zoomIn() {
setState(() { setState(() {
_scale = (_scale + 0.2).clamp(_minScale, _maxScale); _scale = (_scale + 0.2).clamp(_minScale, _maxScale);
_applyTransform(); _transformController.value = Matrix4.identity()..scale(_scale);
}); });
} }
void _zoomOut() { void _zoomOut() {
setState(() { setState(() {
_scale = (_scale - 0.2).clamp(_minScale, _maxScale); _scale = (_scale - 0.2).clamp(_minScale, _maxScale);
_applyTransform(); _transformController.value = Matrix4.identity()..scale(_scale);
}); });
} }
@ -69,14 +76,6 @@ class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
}); });
} }
@override
void initState() {
super.initState();
if (widget.pdfUrl != null) {
_loadPdf();
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_pdfBytes == null) { if (_pdfBytes == null) {
@ -89,37 +88,36 @@ class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
children: [ children: [
InteractiveViewer( InteractiveViewer(
transformationController: _transformController, transformationController: _transformController,
panEnabled: isZoomed, // 👈 ONLY pan when zoomed panEnabled: isZoomed,
scaleEnabled: false, // zoom via buttons only scaleEnabled: false,
boundaryMargin: const EdgeInsets.all(200), boundaryMargin: const EdgeInsets.all(200),
minScale: _minScale, minScale: _minScale,
maxScale: _maxScale, maxScale: _maxScale,
child: SingleChildScrollView( child: PdfDocumentLoader.openData(
controller: _scrollController, _pdfBytes!,
physics: isZoomed documentBuilder: (context, pdfDocument, pageCount) {
? const NeverScrollableScrollPhysics() // no scroll when zoomed return ListView.builder(
: const BouncingScrollPhysics(), // normal scroll controller: _scrollController,
child: PdfDocumentLoader.openData( physics: isZoomed
_pdfBytes!, ? const NeverScrollableScrollPhysics()
documentBuilder: (context, pdfDocument, pageCount) { : const BouncingScrollPhysics(),
return Column( itemCount: pageCount,
children: List.generate( itemBuilder: (context, index) {
pageCount, return Padding(
(index) => Padding( padding: const EdgeInsets.symmetric(vertical: 8),
padding: const EdgeInsets.symmetric(vertical: 8), child: PdfPageView(
child: PdfPageView( pdfDocument: pdfDocument,
pdfDocument: pdfDocument, pageNumber: index + 1,
pageNumber: index + 1, // renderQuality: PdfPageRenderQuality.medium, // performance
),
), ),
), );
); },
}, );
), },
), ),
), ),
// Zoom buttons // Zoom Controls
Positioned( Positioned(
right: 16, right: 16,
top: 16, top: 16,
@ -154,6 +152,7 @@ class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
} }
} }
//scroll zoom code //scroll zoom code
// import 'package:dropdown_search/dropdown_search.dart'; // import 'package:dropdown_search/dropdown_search.dart';
// import 'package:flutter/gestures.dart'; // import 'package:flutter/gestures.dart';
@ -336,4 +335,4 @@ class _PolicyPdfViewerState extends State<PolicyPdfViewer> {
// }, // },
// ); // );
// } // }
// } // }