pdf_scaffold.dart 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_full_pdf_viewer/full_pdf_viewer_plugin.dart';
  5. class CzPDFViewerScaffold extends StatefulWidget {
  6. final PreferredSizeWidget appBar;
  7. final String path;
  8. final bool primary;
  9. const CzPDFViewerScaffold({
  10. Key key,
  11. this.appBar,
  12. @required this.path,
  13. this.primary = true,
  14. }) : super(key: key);
  15. @override
  16. _CzPDFViewerScaffoldState createState() => new _CzPDFViewerScaffoldState();
  17. }
  18. class _CzPDFViewerScaffoldState extends State<CzPDFViewerScaffold> {
  19. final pdfViwerRef = new PDFViewerPlugin();
  20. Rect _rect;
  21. Timer _resizeTimer;
  22. @override
  23. void initState() {
  24. super.initState();
  25. pdfViwerRef.close();
  26. }
  27. @override
  28. void dispose() {
  29. super.dispose();
  30. pdfViwerRef.close();
  31. pdfViwerRef.dispose();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. if (_rect == null) {
  36. _rect = _buildRect(context);
  37. pdfViwerRef.launch(
  38. widget.path,
  39. rect: _rect,
  40. );
  41. } else {
  42. final rect = _buildRect(context);
  43. if (_rect != rect) {
  44. // _rect = rect;
  45. _resizeTimer?.cancel();
  46. _resizeTimer = new Timer(new Duration(milliseconds: 300), () {
  47. pdfViwerRef.resize(_rect);
  48. });
  49. }
  50. }
  51. return new Scaffold(
  52. appBar: widget.appBar,
  53. body: const Center(child: const CircularProgressIndicator()));
  54. }
  55. Rect _buildRect(BuildContext context) {
  56. final fullscreen = widget.appBar == null;
  57. final mediaQuery = MediaQuery.of(context);
  58. final topPadding = widget.primary ? mediaQuery.padding.top : 0.0;
  59. final top =
  60. fullscreen ? 0.0 : widget.appBar.preferredSize.height + topPadding;
  61. var height = mediaQuery.size.height - top;
  62. if (height < 0.0) {
  63. height = 0.0;
  64. }
  65. return new Rect.fromLTWH(0.0, top, mediaQuery.size.width, height);
  66. }
  67. }