From 6b38b6932121d871b6939c9d96ee0a33793f12fc Mon Sep 17 00:00:00 2001 From: Antonino Date: Sun, 7 Apr 2019 21:48:03 +0200 Subject: [PATCH] added possibility to activate the zoom webview Android - no-op on IOS --- .../plugins/webviewflutter/FlutterWebView.java | 11 +++++++++++ packages/webview_flutter/example/lib/main.dart | 1 + packages/webview_flutter/lib/webview_flutter.dart | 12 ++++++++++++ 3 files changed, 24 insertions(+) diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 21720cf6b4a2..f6cacd555e84 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -195,6 +195,9 @@ private void applySettings(Map settings) { webView.setWebViewClient(webViewClient); break; + case "zoomEnabled": + updateZoomMode((boolean) settings.get(key)); + break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); } @@ -214,6 +217,14 @@ private void updateJsMode(int mode) { } } + private void updateZoomMode(boolean mode) { + webView.getSettings().setLoadWithOverviewMode(true); + webView.getSettings().setUseWideViewPort(true); + // Pop-up zoom controls disabled. This is a temporary stop because dialog is not responding to touch events. + webView.getSettings().setDisplayZoomControls(false); + webView.getSettings().setBuiltInZoomControls(mode); + } + private void registerJavaScriptChannelNames(List channelNames) { for (String channelName : channelNames) { webView.addJavascriptInterface( diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 0ec572956df7..5f3966475ef7 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -44,6 +44,7 @@ class WebViewExample extends StatelessWidget { body: Builder(builder: (BuildContext context) { return WebView( initialUrl: 'https://flutter.dev', + zoomEnabled: true, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController webViewController) { _controller.complete(webViewController); diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index d67e769fb1bb..b17e00dc2c79 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -117,6 +117,7 @@ class WebView extends StatefulWidget { this.navigationDelegate, this.gestureRecognizers, this.onPageFinished, + this.zoomEnabled = false, }) : assert(javascriptMode != null), super(key: key); @@ -204,6 +205,10 @@ class WebView extends StatefulWidget { /// directly in the HTML has been loaded and code injected with /// [WebViewController.evaluateJavascript] can assume this. final PageFinishedCallback onPageFinished; + + /// Enable/Disable zoom + /// Note: no-op on IOS + final bool zoomEnabled; @override State createState() => _WebViewState(); @@ -324,22 +329,26 @@ class _WebSettings { _WebSettings({ this.javascriptMode, this.hasNavigationDelegate, + this.zoomEnabled, }); static _WebSettings fromWidget(WebView widget) { return _WebSettings( javascriptMode: widget.javascriptMode, hasNavigationDelegate: widget.navigationDelegate != null, + zoomEnabled: widget.zoomEnabled, ); } final JavascriptMode javascriptMode; final bool hasNavigationDelegate; + final bool zoomEnabled; Map toMap() { return { 'jsMode': javascriptMode.index, 'hasNavigationDelegate': hasNavigationDelegate, + 'zoomEnabled': zoomEnabled, }; } @@ -351,6 +360,9 @@ class _WebSettings { if (hasNavigationDelegate != newSettings.hasNavigationDelegate) { updates['hasNavigationDelegate'] = newSettings.hasNavigationDelegate; } + if (zoomEnabled != newSettings.zoomEnabled) { + updates['zoomEnabled'] = newSettings.zoomEnabled; + } return updates; } }