webview_scaffold.dart 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:meta/meta.dart';
  4. import 'base.dart';
  5. class WebviewScaffold extends StatefulWidget {
  6. final PreferredSizeWidget appBar;
  7. final String url;
  8. final withJavascript;
  9. final clearCache;
  10. final clearCookies;
  11. final enableAppScheme;
  12. final userAgent;
  13. final primary;
  14. WebviewScaffold(
  15. {Key key,
  16. this.appBar,
  17. @required this.url,
  18. this.withJavascript,
  19. this.clearCache,
  20. this.clearCookies,
  21. this.enableAppScheme,
  22. this.userAgent,
  23. this.primary: true})
  24. : super(key: key);
  25. @override
  26. _WebviewScaffoldState createState() => new _WebviewScaffoldState();
  27. }
  28. class _WebviewScaffoldState extends State<WebviewScaffold> {
  29. final webviewReference = new FlutterWebviewPlugin();
  30. Rect _rect;
  31. Timer _resizeTimer;
  32. void initState() {
  33. super.initState();
  34. webviewReference.close();
  35. }
  36. void dispose() {
  37. super.dispose();
  38. webviewReference.close();
  39. webviewReference.dispose();
  40. }
  41. @override
  42. Widget build(BuildContext context) {
  43. if (_rect == null) {
  44. _rect = _buildRect(context);
  45. webviewReference.launch(widget.url,
  46. withJavascript: widget.withJavascript,
  47. clearCache: widget.clearCache,
  48. clearCookies: widget.clearCookies,
  49. enableAppScheme: widget.enableAppScheme,
  50. userAgent: widget.userAgent,
  51. rect: _rect);
  52. } else {
  53. Rect rect = _buildRect(context);
  54. if (_rect != rect) {
  55. _rect = rect;
  56. _resizeTimer?.cancel();
  57. _resizeTimer = new Timer(new Duration(milliseconds: 300), () {
  58. // avoid resizing to fast when build is called multiple time
  59. webviewReference.resize(_rect);
  60. });
  61. }
  62. }
  63. return new Scaffold(
  64. appBar: widget.appBar,
  65. body: new Center(child: new CircularProgressIndicator()));
  66. }
  67. Rect _buildRect(BuildContext context) {
  68. bool fullscreen = widget.appBar == null;
  69. final mediaQuery = MediaQuery.of(context);
  70. final topPadding = widget.primary ? mediaQuery.padding.top : 0.0;
  71. final appBarHeight =
  72. fullscreen ? 0.0 : widget.appBar.preferredSize.height + topPadding;
  73. return new Rect.fromLTWH(0.0, appBarHeight, mediaQuery.size.width,
  74. mediaQuery.size.height - appBarHeight);
  75. }
  76. }