Aleksei
Committed by David PHAM-VAN

Add `enableScrollToPage`

@@ -50,6 +50,7 @@ class PdfPreviewCustom extends StatefulWidget { @@ -50,6 +50,7 @@ class PdfPreviewCustom extends StatefulWidget {
50 this.scrollPhysics, 50 this.scrollPhysics,
51 this.shrinkWrap = false, 51 this.shrinkWrap = false,
52 this.pagesBuilder, 52 this.pagesBuilder,
  53 + this.enableScrollToPage = false,
53 }) : super(key: key); 54 }) : super(key: key);
54 55
55 /// Pdf paper page format 56 /// Pdf paper page format
@@ -102,6 +103,9 @@ class PdfPreviewCustom extends StatefulWidget { @@ -102,6 +103,9 @@ class PdfPreviewCustom extends StatefulWidget {
102 /// their own pages. 103 /// their own pages.
103 final CustomPdfPagesBuilder? pagesBuilder; 104 final CustomPdfPagesBuilder? pagesBuilder;
104 105
  106 + /// Whether scroll to page functionality enabled.
  107 + final bool enableScrollToPage;
  108 +
105 @override 109 @override
106 PdfPreviewCustomState createState() => PdfPreviewCustomState(); 110 PdfPreviewCustomState createState() => PdfPreviewCustomState();
107 } 111 }
@@ -110,7 +114,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -110,7 +114,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
110 with PdfPreviewRaster { 114 with PdfPreviewRaster {
111 final listView = GlobalKey(); 115 final listView = GlobalKey();
112 116
113 - final _pageGlobalKeys = List.generate(100, (index) => GlobalKey()); 117 + late List<GlobalKey> _pageGlobalKeys;
114 118
115 bool infoLoaded = false; 119 bool infoLoaded = false;
116 120
@@ -217,32 +221,62 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -217,32 +221,62 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
217 ); 221 );
218 } 222 }
219 223
  224 + _pageGlobalKeys = List.generate(pages.length, (index) => GlobalKey());
  225 +
220 if (widget.pagesBuilder != null) { 226 if (widget.pagesBuilder != null) {
221 return widget.pagesBuilder!(context, pages); 227 return widget.pagesBuilder!(context, pages);
222 } 228 }
223 229
224 - return ListView.builder(  
225 - controller: scrollController,  
226 - shrinkWrap: widget.shrinkWrap,  
227 - physics: widget.scrollPhysics,  
228 - padding: widget.padding,  
229 - itemCount: pages.length,  
230 - itemBuilder: (BuildContext context, int index) => GestureDetector(  
231 - onDoubleTap: () {  
232 - setState(() {  
233 - updatePosition = scrollController.position.pixels;  
234 - preview = index;  
235 - transformationController.value.setIdentity();  
236 - });  
237 - },  
238 - child: PdfPreviewPage(  
239 - key: getPageKey(index),  
240 - pageData: pages[index],  
241 - pdfPreviewPageDecoration: widget.pdfPreviewPageDecoration,  
242 - pageMargin: widget.previewPageMargin,  
243 - ),  
244 - ),  
245 - ); 230 + return widget.enableScrollToPage
  231 + ? Scrollbar(
  232 + controller: scrollController,
  233 + child: SingleChildScrollView(
  234 + controller: scrollController,
  235 + physics: widget.scrollPhysics,
  236 + child: Column(
  237 + children: List.generate(
  238 + pages.length,
  239 + (index) => GestureDetector(
  240 + onDoubleTap: () {
  241 + setState(() {
  242 + updatePosition = scrollController.position.pixels;
  243 + preview = index;
  244 + transformationController.value.setIdentity();
  245 + });
  246 + },
  247 + child: PdfPreviewPage(
  248 + key: getPageKey(index),
  249 + pageData: pages[index],
  250 + pdfPreviewPageDecoration: widget.pdfPreviewPageDecoration,
  251 + pageMargin: widget.previewPageMargin,
  252 + ),
  253 + ),
  254 + ),
  255 + ),
  256 + ),
  257 + )
  258 + : ListView.builder(
  259 + controller: scrollController,
  260 + shrinkWrap: widget.shrinkWrap,
  261 + physics: widget.scrollPhysics,
  262 + padding: widget.padding,
  263 + itemCount: pages.length,
  264 + itemBuilder: (BuildContext context, int index) => GestureDetector(
  265 + onDoubleTap: () {
  266 + setState(() {
  267 + updatePosition = scrollController.position.pixels;
  268 + preview = index;
  269 + transformationController.value.setIdentity();
  270 + });
  271 + },
  272 + child: PdfPreviewPage(
  273 + key: getPageKey(index),
  274 + pageData: pages[index],
  275 + pdfPreviewPageDecoration: widget.pdfPreviewPageDecoration,
  276 + pageMargin: widget.previewPageMargin,
  277 + ),
  278 + ),
  279 + );
246 } 280 }
247 281
248 Widget _zoomPreview() { 282 Widget _zoomPreview() {
@@ -64,6 +64,7 @@ class PdfPreview extends StatefulWidget { @@ -64,6 +64,7 @@ class PdfPreview extends StatefulWidget {
64 this.onPageFormatChanged, 64 this.onPageFormatChanged,
65 this.dpi, 65 this.dpi,
66 this.actionBarTheme = const PdfActionBarTheme(), 66 this.actionBarTheme = const PdfActionBarTheme(),
  67 + this.enableScrollToPage = false,
67 }) : _pagesBuilder = null, 68 }) : _pagesBuilder = null,
68 super(key: key); 69 super(key: key);
69 70
@@ -123,6 +124,7 @@ class PdfPreview extends StatefulWidget { @@ -123,6 +124,7 @@ class PdfPreview extends StatefulWidget {
123 this.dpi, 124 this.dpi,
124 this.actionBarTheme = const PdfActionBarTheme(), 125 this.actionBarTheme = const PdfActionBarTheme(),
125 required CustomPdfPagesBuilder pagesBuilder, 126 required CustomPdfPagesBuilder pagesBuilder,
  127 + this.enableScrollToPage = false,
126 }) : _pagesBuilder = pagesBuilder, 128 }) : _pagesBuilder = pagesBuilder,
127 super(key: key); 129 super(key: key);
128 130
@@ -233,6 +235,9 @@ class PdfPreview extends StatefulWidget { @@ -233,6 +235,9 @@ class PdfPreview extends StatefulWidget {
233 /// their own pages. 235 /// their own pages.
234 final CustomPdfPagesBuilder? _pagesBuilder; 236 final CustomPdfPagesBuilder? _pagesBuilder;
235 237
  238 + /// Whether scroll to page functionality enabled.
  239 + final bool enableScrollToPage;
  240 +
236 @override 241 @override
237 PdfPreviewState createState() => PdfPreviewState(); 242 PdfPreviewState createState() => PdfPreviewState();
238 } 243 }
@@ -302,7 +307,6 @@ class PdfPreviewState extends State<PdfPreview> { @@ -302,7 +307,6 @@ class PdfPreviewState extends State<PdfPreview> {
302 initialPageFormat: previewData.pageFormat, 307 initialPageFormat: previewData.pageFormat,
303 onComputeActualPageFormat: computeActualPageFormat, 308 onComputeActualPageFormat: computeActualPageFormat,
304 ); 309 );
305 - setState(() {});  
306 } 310 }
307 super.didUpdateWidget(oldWidget); 311 super.didUpdateWidget(oldWidget);
308 } 312 }
@@ -406,6 +410,7 @@ class PdfPreviewState extends State<PdfPreview> { @@ -406,6 +410,7 @@ class PdfPreviewState extends State<PdfPreview> {
406 shouldRepaint: widget.shouldRepaint, 410 shouldRepaint: widget.shouldRepaint,
407 pagesBuilder: widget._pagesBuilder, 411 pagesBuilder: widget._pagesBuilder,
408 dpi: widget.dpi, 412 dpi: widget.dpi,
  413 + enableScrollToPage: widget.enableScrollToPage,
409 ); 414 );
410 }), 415 }),
411 ), 416 ),