From 5db93fe0da89a84474519fb10501426f951aad20 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Thu, 30 May 2019 14:31:03 -0700 Subject: [PATCH 1/3] Move clearCookies behind the platform abstraction --- .../lib/platform_interface.dart | 42 ++++++++++------- .../lib/src/webview_android.dart | 9 +++- .../lib/src/webview_cupertino.dart | 9 +++- .../lib/src/webview_method_channel.dart | 17 ++++++- .../webview_flutter/lib/webview_flutter.dart | 46 ++++++++----------- .../test/webview_flutter_test.dart | 17 ++++--- 6 files changed, 84 insertions(+), 56 deletions(-) diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 5d8899ae9e3a..fd2f8ff067ad 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -10,20 +10,20 @@ import 'package:flutter/widgets.dart'; import 'webview_flutter.dart'; -/// Interface for callbacks made by [WebViewPlatform]. +/// Interface for callbacks made by [WebViewPlatformController]. /// -/// The webview plugin implements this class, and passes an instance to the [WebViewPlatform]. -/// [WebViewPlatform] is notifying this handler on events that happened on the platform's webview. +/// The webview plugin implements this class, and passes an instance to the [WebViewPlatformController]. +/// [WebViewPlatformController] is notifying this handler on events that happened on the platform's webview. abstract class WebViewPlatformCallbacksHandler { - /// Invoked by [WebViewPlatform] when a JavaScript channel message is received. + /// Invoked by [WebViewPlatformController] when a JavaScript channel message is received. void onJavaScriptChannelMessage(String channel, String message); - /// Invoked by [WebViewPlatform] when a navigation request is pending. + /// Invoked by [WebViewPlatformController] when a navigation request is pending. /// /// If true is returned the navigation is allowed, otherwise it is blocked. bool onNavigationRequest({String url, bool isForMainFrame}); - /// Invoked by [WebViewPlatform] when a page has finished loading. + /// Invoked by [WebViewPlatformController] when a page has finished loading. void onPageFinished(String url); } @@ -31,13 +31,13 @@ abstract class WebViewPlatformCallbacksHandler { /// /// An instance implementing this interface is passed to the `onWebViewPlatformCreated` callback that is /// passed to [WebViewPlatformBuilder#onWebViewPlatformCreated]. -abstract class WebViewPlatform { +abstract class WebViewPlatformController { /// Creates a new WebViewPlatform. /// /// Callbacks made by the WebView will be delegated to `handler`. /// /// The `handler` parameter must not be null. - WebViewPlatform(WebViewPlatformCallbacksHandler handler); + WebViewPlatformController(WebViewPlatformCallbacksHandler handler); /// Loads the specified URL. /// @@ -182,7 +182,7 @@ class WebSettings { } } -/// Configuration to use when creating a new [WebViewPlatform]. +/// Configuration to use when creating a new [WebViewPlatformController]. class CreationParams { CreationParams( {this.initialUrl, this.webSettings, this.javascriptChannelNames}); @@ -194,7 +194,7 @@ class CreationParams { /// The initial [WebSettings] for the new webview. /// - /// This can later be updated with [WebViewPlatform.updateSettings]. + /// This can later be updated with [WebViewPlatformController.updateSettings]. final WebSettings webSettings; /// The initial set of JavaScript channels that are configured for this webview. @@ -217,14 +217,14 @@ class CreationParams { } typedef WebViewPlatformCreatedCallback = void Function( - WebViewPlatform webViewPlatform); + WebViewPlatformController webViewPlatform); -/// Interface building a platform WebView implementation. +/// Interface for a platform implementation of a WebView. /// -/// [WebView#platformBuilder] controls the builder that is used by [WebView]. +/// [WebView.platform] controls the builder that is used by [WebView]. /// [AndroidWebViewPlatform] and [CupertinoWebViewPlatform] are the default implementations /// for Android and iOS respectively. -abstract class WebViewBuilder { +abstract class WebViewPlatform { /// Builds a new WebView. /// /// Returns a Widget tree that embeds the created webview. @@ -232,10 +232,10 @@ abstract class WebViewBuilder { /// `creationParams` are the initial parameters used to setup the webview. /// /// `webViewPlatformHandler` will be used for handling callbacks that are made by the created - /// [WebViewPlatform]. + /// [WebViewPlatformController]. /// - /// `onWebViewPlatformCreated` will be invoked after the platform specific [WebViewPlatform] - /// implementation is created with the [WebViewPlatform] instance as a parameter. + /// `onWebViewPlatformCreated` will be invoked after the platform specific [WebViewPlatformController] + /// implementation is created with the [WebViewPlatformController] instance as a parameter. /// /// `gestureRecognizers` specifies which gestures should be consumed by the web view. /// It is possible for other gesture recognizers to be competing with the web view on pointer @@ -256,4 +256,12 @@ abstract class WebViewBuilder { WebViewPlatformCreatedCallback onWebViewPlatformCreated, Set> gestureRecognizers, }); + + /// Clears all cookies for all [WebView] instances. + /// + /// Returns true if cookies were present before clearing, else false. + Future clearCookies() { + throw UnimplementedError( + "WebView clearCookies is not implemented on the current platform"); + } } diff --git a/packages/webview_flutter/lib/src/webview_android.dart b/packages/webview_flutter/lib/src/webview_android.dart index 8d5f98a61512..f7afcc0637a3 100644 --- a/packages/webview_flutter/lib/src/webview_android.dart +++ b/packages/webview_flutter/lib/src/webview_android.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; @@ -12,10 +14,10 @@ import 'webview_method_channel.dart'; /// Builds an Android webview. /// -/// This is used as the default implementation for [WebView.platformBuilder] on Android. It uses +/// This is used as the default implementation for [WebView.platform] on Android. It uses /// an [AndroidView] to embed the webview in the widget hierarchy, and uses a method channel to /// communicate with the platform code. -class AndroidWebViewBuilder implements WebViewBuilder { +class AndroidWebView implements WebViewPlatform { @override Widget build({ BuildContext context, @@ -55,4 +57,7 @@ class AndroidWebViewBuilder implements WebViewBuilder { ), ); } + + @override + Future clearCookies() => MethodChannelWebViewPlatform.clearCookies(); } diff --git a/packages/webview_flutter/lib/src/webview_cupertino.dart b/packages/webview_flutter/lib/src/webview_cupertino.dart index 04ca9d78eabc..0e84908261e4 100644 --- a/packages/webview_flutter/lib/src/webview_cupertino.dart +++ b/packages/webview_flutter/lib/src/webview_cupertino.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; @@ -12,10 +14,10 @@ import 'webview_method_channel.dart'; /// Builds an iOS webview. /// -/// This is used as the default implementation for [WebView.platformBuilder] on iOS. It uses +/// This is used as the default implementation for [WebView.platform] on iOS. It uses /// a [UiKitView] to embed the webview in the widget hierarchy, and uses a method channel to /// communicate with the platform code. -class CupertinoWebViewBuilder implements WebViewBuilder { +class CupertinoWebView implements WebViewPlatform { @override Widget build({ BuildContext context, @@ -39,4 +41,7 @@ class CupertinoWebViewBuilder implements WebViewBuilder { creationParamsCodec: const StandardMessageCodec(), ); } + + @override + Future clearCookies() => MethodChannelWebViewPlatform.clearCookies(); } diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index d86a8b4cd2e7..91cb3b6cfc19 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -8,8 +8,8 @@ import 'package:flutter/services.dart'; import '../platform_interface.dart'; -/// A [WebViewPlatform] that uses a method channel to control the webview. -class MethodChannelWebViewPlatform implements WebViewPlatform { +/// A [WebViewPlatformController] that uses a method channel to control the webview. +class MethodChannelWebViewPlatform implements WebViewPlatformController { MethodChannelWebViewPlatform(int id, this._platformCallbacksHandler) : assert(_platformCallbacksHandler != null), _channel = MethodChannel('plugins.flutter.io/webview_$id') { @@ -20,6 +20,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatform { final MethodChannel _channel; + static const MethodChannel _cookieManagerChannel = + MethodChannel('plugins.flutter.io/cookie_manager'); + Future _onMethodCall(MethodCall call) async { switch (call.method) { case 'javascriptChannelMessage': @@ -105,6 +108,16 @@ class MethodChannelWebViewPlatform implements WebViewPlatform { 'removeJavascriptChannels', javascriptChannelNames.toList()); } + /// Method channel mplementation for [WebViewPlatform.clearCookies]. + static Future clearCookies() { + return _cookieManagerChannel + // TODO(amirh): remove this when the invokeMethod update makes it to stable Flutter. + // https://github.com/flutter/flutter/issues/26431 + // ignore: strong_mode_implicit_dynamic_method + .invokeMethod('clearCookies') + .then((dynamic result) => result); + } + static Map _webSettingsToMap(WebSettings settings) { final Map map = {}; void _addIfNonNull(String key, dynamic value) { diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index dd7e9203a667..8dda7ea8dce9 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -6,7 +6,6 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; -import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'platform_interface.dart'; @@ -125,37 +124,37 @@ class WebView extends StatefulWidget { }) : assert(javascriptMode != null), super(key: key); - static WebViewBuilder _platformBuilder; + static WebViewPlatform _platform; - /// Sets a custom [WebViewBuilder]. + /// Sets a custom [WebViewPlatform]. /// /// This property can be set to use a custom platform implementation for WebViews. /// - /// Setting `platformBuilder` doesn't affect [WebView]s that were already created. + /// Setting `platform` doesn't affect [WebView]s that were already created. /// - /// The default value is [AndroidWebViewBuilder] on Android and [CupertinoWebViewBuilder] on iOs. - static set platformBuilder(WebViewBuilder platformBuilder) { - _platformBuilder = platformBuilder; + /// The default value is [AndroidWebView] on Android and [CupertinoWebView] on iOs. + static set platform(WebViewPlatform platformBuilder) { + _platform = platformBuilder; } - /// The [WebViewBuilder] that's used to create new [WebView]s. + /// The WebView platform that's used by this WebView. /// - /// The default value is [AndroidWebViewBuilder] on Android and [CupertinoWebViewBuilder] on iOs. - static WebViewBuilder get platformBuilder { - if (_platformBuilder == null) { + /// The default value is [AndroidWebView] on Android and [CupertinoWebView] on iOS. + static WebViewPlatform get platform { + if (_platform == null) { switch (defaultTargetPlatform) { case TargetPlatform.android: - _platformBuilder = AndroidWebViewBuilder(); + _platform = AndroidWebView(); break; case TargetPlatform.iOS: - _platformBuilder = CupertinoWebViewBuilder(); + _platform = CupertinoWebView(); break; default: throw UnsupportedError( "Trying to use the default webview implementation for $defaultTargetPlatform but there isn't a default one"); } } - return _platformBuilder; + return _platform; } /// If not null invoked once the web view is created. @@ -268,7 +267,7 @@ class _WebViewState extends State { @override Widget build(BuildContext context) { - return WebView.platformBuilder.build( + return WebView.platform.build( context: context, onWebViewPlatformCreated: _onWebViewPlatformCreated, webViewPlatformCallbacksHandler: _platformCallbacksHandler, @@ -294,7 +293,7 @@ class _WebViewState extends State { }); } - void _onWebViewPlatformCreated(WebViewPlatform webViewPlatform) { + void _onWebViewPlatformCreated(WebViewPlatformController webViewPlatform) { final WebViewController controller = WebViewController._(widget, webViewPlatform, _platformCallbacksHandler); _controller.complete(controller); @@ -422,7 +421,7 @@ class WebViewController { _settings = _webSettingsFromWidget(_widget); } - final WebViewPlatform _webViewPlatform; + final WebViewPlatformController _webViewPlatform; final _PlatformCallbacksHandler _platformCallbacksHandler; @@ -580,21 +579,14 @@ class CookieManager { CookieManager._(); - static const MethodChannel _channel = - MethodChannel('plugins.flutter.io/cookie_manager'); static CookieManager _instance; - /// Clears all cookies. + /// Clears all cookies for all [WebView] instances. /// - /// This is supported for >= IOS 9. + /// This is a no op on iOS version smaller than 9. /// /// Returns true if cookies were present before clearing, else false. - Future clearCookies() => _channel - // TODO(amirh): remove this when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod('clearCookies') - .then((dynamic result) => result); + Future clearCookies() => WebView.platform.clearCookies(); } // Throws an ArgumentError if `url` is not a valid URL string. diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 2a458ad434b7..9db06415469e 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -752,10 +752,10 @@ void main() { group('Custom platform implementation', () { setUpAll(() { - WebView.platformBuilder = MyWebViewBuilder(); + WebView.platform = MyWebViewBuilder(); }); tearDownAll(() { - WebView.platformBuilder = null; + WebView.platform = null; }); testWidgets('creation', (WidgetTester tester) async { @@ -765,7 +765,7 @@ void main() { ), ); - final MyWebViewBuilder builder = WebView.platformBuilder; + final MyWebViewBuilder builder = WebView.platform; final MyWebViewPlatform platform = builder.lastPlatformBuilt; expect( @@ -794,7 +794,7 @@ void main() { ), ); - final MyWebViewBuilder builder = WebView.platformBuilder; + final MyWebViewBuilder builder = WebView.platform; final MyWebViewPlatform platform = builder.lastPlatformBuilt; final Map headers = { @@ -1033,7 +1033,7 @@ class _FakeCookieManager { } } -class MyWebViewBuilder implements WebViewBuilder { +class MyWebViewBuilder implements WebViewPlatform { MyWebViewPlatform lastPlatformBuilt; @override @@ -1050,9 +1050,14 @@ class MyWebViewBuilder implements WebViewBuilder { onWebViewPlatformCreated(lastPlatformBuilt); return Container(); } + + @override + Future clearCookies() { + return Future.sync(() => null); + } } -class MyWebViewPlatform extends WebViewPlatform { +class MyWebViewPlatform extends WebViewPlatformController { MyWebViewPlatform(this.creationParams, this.gestureRecognizers, WebViewPlatformCallbacksHandler platformHandler) : super(platformHandler); From bf71cb6e73e46ba189454016a0371a046c1910b1 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Fri, 31 May 2019 14:11:16 -0700 Subject: [PATCH 2/3] review comments followup --- .../lib/platform_interface.dart | 2 +- .../webview_flutter/lib/webview_flutter.dart | 36 +++++++++---------- .../test/webview_flutter_test.dart | 20 +++++------ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index fd2f8ff067ad..bfb5b6255421 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -217,7 +217,7 @@ class CreationParams { } typedef WebViewPlatformCreatedCallback = void Function( - WebViewPlatformController webViewPlatform); + WebViewPlatformController webViewPlatformController); /// Interface for a platform implementation of a WebView. /// diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 8dda7ea8dce9..3c0175e2f22b 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -132,9 +132,9 @@ class WebView extends StatefulWidget { /// /// Setting `platform` doesn't affect [WebView]s that were already created. /// - /// The default value is [AndroidWebView] on Android and [CupertinoWebView] on iOs. - static set platform(WebViewPlatform platformBuilder) { - _platform = platformBuilder; + /// The default value is [AndroidWebView] on Android and [CupertinoWebView] on iOS. + static set platform(WebViewPlatform platform) { + _platform = platform; } /// The WebView platform that's used by this WebView. @@ -415,13 +415,13 @@ class _PlatformCallbacksHandler implements WebViewPlatformCallbacksHandler { class WebViewController { WebViewController._( this._widget, - this._webViewPlatform, + this._webViewPlatformController, this._platformCallbacksHandler, - ) : assert(_webViewPlatform != null) { + ) : assert(_webViewPlatformController != null) { _settings = _webSettingsFromWidget(_widget); } - final WebViewPlatformController _webViewPlatform; + final WebViewPlatformController _webViewPlatformController; final _PlatformCallbacksHandler _platformCallbacksHandler; @@ -443,7 +443,7 @@ class WebViewController { }) async { assert(url != null); _validateUrlString(url); - return _webViewPlatform.loadUrl(url, headers); + return _webViewPlatformController.loadUrl(url, headers); } /// Accessor to the current URL that the WebView is displaying. @@ -454,7 +454,7 @@ class WebViewController { /// words, by the time this future completes, the WebView may be displaying a /// different URL). Future currentUrl() { - return _webViewPlatform.currentUrl(); + return _webViewPlatformController.currentUrl(); } /// Checks whether there's a back history item. @@ -462,7 +462,7 @@ class WebViewController { /// Note that this operation is asynchronous, and it is possible that the "canGoBack" state has /// changed by the time the future completed. Future canGoBack() { - return _webViewPlatform.canGoBack(); + return _webViewPlatformController.canGoBack(); } /// Checks whether there's a forward history item. @@ -470,26 +470,26 @@ class WebViewController { /// Note that this operation is asynchronous, and it is possible that the "canGoForward" state has /// changed by the time the future completed. Future canGoForward() { - return _webViewPlatform.canGoForward(); + return _webViewPlatformController.canGoForward(); } /// Goes back in the history of this WebView. /// /// If there is no back history item this is a no-op. Future goBack() { - return _webViewPlatform.goBack(); + return _webViewPlatformController.goBack(); } /// Goes forward in the history of this WebView. /// /// If there is no forward history item this is a no-op. Future goForward() { - return _webViewPlatform.goForward(); + return _webViewPlatformController.goForward(); } /// Reloads the current URL. Future reload() { - return _webViewPlatform.reload(); + return _webViewPlatformController.reload(); } /// Clears all caches used by the [WebView]. @@ -503,7 +503,7 @@ class WebViewController { /// /// Note: Calling this method also triggers a reload. Future clearCache() async { - await _webViewPlatform.clearCache(); + await _webViewPlatformController.clearCache(); return reload(); } @@ -517,7 +517,7 @@ class WebViewController { final WebSettings update = _clearUnchangedWebSettings(_settings, newSettings); _settings = newSettings; - return _webViewPlatform.updateSettings(update); + return _webViewPlatformController.updateSettings(update); } Future _updateJavascriptChannels( @@ -530,10 +530,10 @@ class WebViewController { final Set channelsToRemove = currentChannels.difference(newChannelNames); if (channelsToRemove.isNotEmpty) { - _webViewPlatform.removeJavascriptChannels(channelsToRemove); + _webViewPlatformController.removeJavascriptChannels(channelsToRemove); } if (channelsToAdd.isNotEmpty) { - _webViewPlatform.addJavascriptChannels(channelsToAdd); + _webViewPlatformController.addJavascriptChannels(channelsToAdd); } _platformCallbacksHandler._updateJavascriptChannelsFromSet(newChannels); } @@ -566,7 +566,7 @@ class WebViewController { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - return _webViewPlatform.evaluateJavascript(javascriptString); + return _webViewPlatformController.evaluateJavascript(javascriptString); } } diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 9db06415469e..d451a86b19c8 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -752,7 +752,7 @@ void main() { group('Custom platform implementation', () { setUpAll(() { - WebView.platform = MyWebViewBuilder(); + WebView.platform = MyWebViewPlatform(); }); tearDownAll(() { WebView.platform = null; @@ -765,8 +765,8 @@ void main() { ), ); - final MyWebViewBuilder builder = WebView.platform; - final MyWebViewPlatform platform = builder.lastPlatformBuilt; + final MyWebViewPlatform builder = WebView.platform; + final MyWebViewPlatformController platform = builder.lastPlatformBuilt; expect( platform.creationParams, @@ -794,8 +794,8 @@ void main() { ), ); - final MyWebViewBuilder builder = WebView.platform; - final MyWebViewPlatform platform = builder.lastPlatformBuilt; + final MyWebViewPlatform builder = WebView.platform; + final MyWebViewPlatformController platform = builder.lastPlatformBuilt; final Map headers = { 'header': 'value', @@ -1033,8 +1033,8 @@ class _FakeCookieManager { } } -class MyWebViewBuilder implements WebViewPlatform { - MyWebViewPlatform lastPlatformBuilt; +class MyWebViewPlatform implements WebViewPlatform { + MyWebViewPlatformController lastPlatformBuilt; @override Widget build({ @@ -1045,7 +1045,7 @@ class MyWebViewBuilder implements WebViewPlatform { Set> gestureRecognizers, }) { assert(onWebViewPlatformCreated != null); - lastPlatformBuilt = MyWebViewPlatform( + lastPlatformBuilt = MyWebViewPlatformController( creationParams, gestureRecognizers, webViewPlatformCallbacksHandler); onWebViewPlatformCreated(lastPlatformBuilt); return Container(); @@ -1057,8 +1057,8 @@ class MyWebViewBuilder implements WebViewPlatform { } } -class MyWebViewPlatform extends WebViewPlatformController { - MyWebViewPlatform(this.creationParams, this.gestureRecognizers, +class MyWebViewPlatformController extends WebViewPlatformController { + MyWebViewPlatformController(this.creationParams, this.gestureRecognizers, WebViewPlatformCallbacksHandler platformHandler) : super(platformHandler); From db2f36e46f4c81be5e07c2f73d400c0d1ddcafc4 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Fri, 31 May 2019 14:32:06 -0700 Subject: [PATCH 3/3] version bump and changelog update --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 306181cea52e..4ba62029a2f3 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.9 + +* Allow external packages to provide webview implementations for new platforms. + ## 0.3.8+1 * Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index da24d39e0196..2dbabc8019ac 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.8+1 +version: 0.3.9 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter