pdf rendering issue fix
This commit is contained in:
parent
ab55141a17
commit
038b178a3c
File diff suppressed because one or more lines are too long
@ -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> {
|
|||||||
// },
|
// },
|
||||||
// );
|
// );
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
Loading…
Reference in New Issue
Block a user