| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- import 'dart:async';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter/rendering.dart';
- import 'base.dart';
- class WebviewScaffold extends StatefulWidget {
- final PreferredSizeWidget appBar;
- final String url;
- final bool withJavascript;
- final bool clearCache;
- final bool clearCookies;
- final bool enableAppScheme;
- final String userAgent;
- final bool primary;
- final List<Widget> persistentFooterButtons;
- final Widget bottomNavigationBar;
- final bool withZoom;
- final bool withLocalStorage;
- final bool withLocalUrl;
- final bool scrollBar;
- final Map<String, String> headers;
- const WebviewScaffold(
- {Key key,
- this.appBar,
- @required this.url,
- this.headers,
- this.withJavascript,
- this.clearCache,
- this.clearCookies,
- this.enableAppScheme,
- this.userAgent,
- this.primary = true,
- this.persistentFooterButtons,
- this.bottomNavigationBar,
- this.withZoom,
- this.withLocalStorage,
- this.withLocalUrl,
- this.scrollBar})
- : super(key: key);
- @override
- _WebviewScaffoldState createState() => new _WebviewScaffoldState();
- }
- class _WebviewScaffoldState extends State<WebviewScaffold> {
- final webviewReference = new FlutterWebviewPlugin();
- Rect _rect;
- Timer _resizeTimer;
- @override
- void initState() {
- super.initState();
- webviewReference.close();
- }
- @override
- void dispose() {
- super.dispose();
- _resizeTimer?.cancel();
- webviewReference.close();
- webviewReference.dispose();
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: widget.appBar,
- persistentFooterButtons: widget.persistentFooterButtons,
- bottomNavigationBar: widget.bottomNavigationBar,
- body: _WebviewPlaceholder(
- onRectChanged: (Rect value) {
- if (_rect == null) {
- _rect = value;
- webviewReference.launch(
- widget.url,
- headers: widget.headers,
- withJavascript: widget.withJavascript,
- clearCache: widget.clearCache,
- clearCookies: widget.clearCookies,
- enableAppScheme: widget.enableAppScheme,
- userAgent: widget.userAgent,
- rect: _rect,
- withZoom: widget.withZoom,
- withLocalStorage: widget.withLocalStorage,
- withLocalUrl: widget.withLocalUrl,
- scrollBar: widget.scrollBar,
- );
- } else {
- if (_rect != value) {
- _rect = value;
- _resizeTimer?.cancel();
- _resizeTimer = Timer(const Duration(milliseconds: 250), () {
- // avoid resizing to fast when build is called multiple time
- webviewReference.resize(_rect);
- });
- }
- }
- },
- child: const Center(
- child: CircularProgressIndicator(),
- ),
- ),
- );
- }
- }
- class _WebviewPlaceholder extends SingleChildRenderObjectWidget {
- const _WebviewPlaceholder({
- Key key,
- @required this.onRectChanged,
- Widget child,
- }) : super(key: key, child: child);
- final ValueChanged<Rect> onRectChanged;
- @override
- RenderObject createRenderObject(BuildContext context) {
- return _WebviewPlaceholderRender(
- onRectChanged: onRectChanged,
- );
- }
- @override
- void updateRenderObject(BuildContext context, _WebviewPlaceholderRender renderObject) {
- renderObject..onRectChanged = onRectChanged;
- }
- }
- class _WebviewPlaceholderRender extends RenderProxyBox {
- ValueChanged<Rect> _callback;
- Rect _rect;
- _WebviewPlaceholderRender({
- RenderBox child,
- ValueChanged<Rect> onRectChanged,
- }) : _callback = onRectChanged,
- super(child);
- Rect get rect => _rect;
- set onRectChanged(ValueChanged<Rect> callback) {
- if (callback != _callback) {
- _callback = callback;
- notifyRect();
- }
- }
- void notifyRect() {
- if (_callback != null && _rect != null) {
- _callback(_rect);
- }
- }
- @override
- void paint(PaintingContext context, Offset offset) {
- super.paint(context, offset);
- final rect = offset & size;
- if (_rect != rect) {
- _rect = rect;
- notifyRect();
- }
- }
- }
|