From e8f8ad88e72826a6163d4903df33f9991e1aa44b Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 16 Jul 2020 20:33:20 -0700 Subject: [PATCH 1/8] Add surface view --- packages/webview_flutter/CHANGELOG.md | 16 ++++++ .../android/app/src/main/AndroidManifest.xml | 4 ++ .../webview_flutter/example/lib/main.dart | 1 + .../lib/src/webview_android.dart | 50 +++++++++++++++++++ .../webview_flutter/lib/webview_flutter.dart | 27 ++++++++-- packages/webview_flutter/pubspec.yaml | 2 +- 6 files changed, 95 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 04155a509b80..3cc0eaf64523 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.3.23 + +* Add `Webview.useExperimentalAndroidSurfaceView` flag that builds Android WebView using hybrid views. + To use this feature, set this value to `true` and have the following lines in your `android/app/src/main/AndroidManifest.xml`: +```xml + +. +. + +. +. + +``` + ## 0.3.22+1 * Update the `setAndGetScrollPosition` to use hard coded values and add a `pumpAndSettle` call. diff --git a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml index f895f92bd7a4..52d6029f297d 100644 --- a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml @@ -13,6 +13,10 @@ + + { print('Page finished loading: $url'); }, gestureNavigationEnabled: true, + useExperimentalAndroidSurfaceView: true, ); }), floatingActionButton: favoriteButton(), diff --git a/packages/webview_flutter/lib/src/webview_android.dart b/packages/webview_flutter/lib/src/webview_android.dart index f7afcc0637a3..4c4543590489 100644 --- a/packages/webview_flutter/lib/src/webview_android.dart +++ b/packages/webview_flutter/lib/src/webview_android.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -58,6 +59,55 @@ class AndroidWebView implements WebViewPlatform { ); } + // ignore: public_member_api_docs + Widget buildWithSurfaceView({ + BuildContext context, + CreationParams creationParams, + @required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, + WebViewPlatformCreatedCallback onWebViewPlatformCreated, + Set> gestureRecognizers, + }) { + assert(webViewPlatformCallbacksHandler != null); + return PlatformViewLink( + viewType: 'plugins.flutter.io/webview', + surfaceFactory: ( + BuildContext context, + PlatformViewController controller, + ) { + return AndroidViewSurface( + controller: controller, + gestureRecognizers: gestureRecognizers ?? + const >{}, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + ); + }, + onCreatePlatformView: (PlatformViewCreationParams params) { + return PlatformViewsService.initSurfaceAndroidView( + id: params.id, + viewType: 'plugins.flutter.io/webview', + // WebView content is not affected by the Android view's layout direction, + // we explicitly set it here so that the widget doesn't require an ambient + // directionality. + layoutDirection: TextDirection.rtl, + creationParams: MethodChannelWebViewPlatform.creationParamsToMap( + creationParams, + ), + creationParamsCodec: const StandardMessageCodec(), + ) + ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) + ..addOnPlatformViewCreatedListener((int id) { + if (onWebViewPlatformCreated == null) { + return; + } + onWebViewPlatformCreated( + MethodChannelWebViewPlatform(id, webViewPlatformCallbacksHandler), + ); + }) + ..create(); + }, + ); + } + @override Future clearCookies() => MethodChannelWebViewPlatform.clearCookies(); } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 2635b0446fa2..dedbff916a0a 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -156,6 +156,7 @@ class WebView extends StatefulWidget { this.userAgent, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, + this.useExperimentalAndroidSurfaceView = false, }) : assert(javascriptMode != null), assert(initialMediaPlaybackPolicy != null), super(key: key); @@ -329,6 +330,16 @@ class WebView extends StatefulWidget { /// The default policy is [AutoMediaPlaybackPolicy.require_user_action_for_all_media_types]. final AutoMediaPlaybackPolicy initialMediaPlaybackPolicy; + /// Whether to use `AndroidViewSurface` and `SurfaceAndroidViewController` to create the widget. + /// + /// This flag is temporary and is highly subject to removal. One should only + /// use this if they are willing to test [WebView] features that aren't + /// available in the standard version and acknowledges that it is possible + /// this can have slower performance and/or unpredictable bugs. + /// + /// Defaults to false. + final bool useExperimentalAndroidSurfaceView; + @override State createState() => _WebViewState(); } @@ -341,7 +352,17 @@ class _WebViewState extends State { @override Widget build(BuildContext context) { - return WebView.platform.build( + final WebViewPlatform platform = WebView.platform; + if (widget.useExperimentalAndroidSurfaceView && platform is AndroidWebView) { + return platform.buildWithSurfaceView( + context: context, + onWebViewPlatformCreated: _onWebViewPlatformCreated, + webViewPlatformCallbacksHandler: _platformCallbacksHandler, + gestureRecognizers: widget.gestureRecognizers, + creationParams: _creationParamsfromWidget(widget), + ); + } + return platform.build( context: context, onWebViewPlatformCreated: _onWebViewPlatformCreated, webViewPlatformCallbacksHandler: _platformCallbacksHandler, @@ -445,9 +466,7 @@ WebSettings _clearUnchangedWebSettings( Set _extractChannelNames(Set channels) { final Set channelNames = channels == null - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals - ? Set() + ? {} : channels.map((JavascriptChannel channel) => channel.name).toSet(); return channelNames; } diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 2ccc3efcccef..8a4a62ea76a6 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.22+1 +version: 0.3.23 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From 6a5927de27233ee51ee4acaaa07ee8d8d0bd4b84 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 16 Jul 2020 20:37:49 -0700 Subject: [PATCH 2/8] Add test for scrolling hybrid view --- .../test_driver/webview_flutter_e2e.dart | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart index 3468067de603..7661dd2515bf 100644 --- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart @@ -608,6 +608,77 @@ void main() { }); }); + group('Programmatic Scroll with hybrid view', () { + testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { + final String scrollTestPage = ''' + + + + + + +
+ + + '''; + + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); + + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + useExperimentalAndroidSurfaceView: true, + ), + ), + ); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + await tester.pumpAndSettle(Duration(seconds: 3)); + + // Check scrollTo() + const int X_SCROLL = 123; + const int Y_SCROLL = 321; + + await controller.scrollTo(X_SCROLL, Y_SCROLL); + int scrollPosX = await controller.getScrollX(); + int scrollPosY = await controller.getScrollY(); + expect(X_SCROLL, scrollPosX); + expect(Y_SCROLL, scrollPosY); + + // Check scrollBy() (on top of scrollTo()) + await controller.scrollBy(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(X_SCROLL * 2, scrollPosX); + expect(Y_SCROLL * 2, scrollPosY); + }); + }); + group('NavigationDelegate', () { final String blankPage = ""; final String blankPageEncoded = 'data:text/html;charset=utf-8;base64,' + From 8e90cc3a50febe07f761972859d28c3d6d3881f0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Sun, 19 Jul 2020 19:00:41 -0700 Subject: [PATCH 3/8] Create a custom platform for android surface view --- .../webview_flutter/example/lib/main.dart | 7 +- .../test_driver/webview_flutter_e2e.dart | 4 +- .../lib/src/webview_android.dart | 49 ------------ .../webview_flutter/lib/webview_flutter.dart | 80 ++++++++++++++----- 4 files changed, 67 insertions(+), 73 deletions(-) diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 841f7a0ff5a4..42c437d00dc1 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -35,6 +35,12 @@ class _WebViewExampleState extends State { final Completer _controller = Completer(); + @override + void initState() { + super.initState(); + WebView.platform = SurfaceAndroidWebView(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -75,7 +81,6 @@ class _WebViewExampleState extends State { print('Page finished loading: $url'); }, gestureNavigationEnabled: true, - useExperimentalAndroidSurfaceView: true, ); }), floatingActionButton: favoriteButton(), diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart index 7661dd2515bf..bd38ca0c577a 100644 --- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart @@ -609,6 +609,7 @@ void main() { }); group('Programmatic Scroll with hybrid view', () { + WebView.platform = SurfaceAndroidWebView(); testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { final String scrollTestPage = ''' @@ -650,7 +651,6 @@ void main() { onPageFinished: (String url) { pageLoaded.complete(null); }, - useExperimentalAndroidSurfaceView: true, ), ), ); @@ -676,6 +676,8 @@ void main() { scrollPosY = await controller.getScrollY(); expect(X_SCROLL * 2, scrollPosX); expect(Y_SCROLL * 2, scrollPosY); + + WebView.platform = null; }); }); diff --git a/packages/webview_flutter/lib/src/webview_android.dart b/packages/webview_flutter/lib/src/webview_android.dart index 4c4543590489..059073932395 100644 --- a/packages/webview_flutter/lib/src/webview_android.dart +++ b/packages/webview_flutter/lib/src/webview_android.dart @@ -59,55 +59,6 @@ class AndroidWebView implements WebViewPlatform { ); } - // ignore: public_member_api_docs - Widget buildWithSurfaceView({ - BuildContext context, - CreationParams creationParams, - @required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, - WebViewPlatformCreatedCallback onWebViewPlatformCreated, - Set> gestureRecognizers, - }) { - assert(webViewPlatformCallbacksHandler != null); - return PlatformViewLink( - viewType: 'plugins.flutter.io/webview', - surfaceFactory: ( - BuildContext context, - PlatformViewController controller, - ) { - return AndroidViewSurface( - controller: controller, - gestureRecognizers: gestureRecognizers ?? - const >{}, - hitTestBehavior: PlatformViewHitTestBehavior.opaque, - ); - }, - onCreatePlatformView: (PlatformViewCreationParams params) { - return PlatformViewsService.initSurfaceAndroidView( - id: params.id, - viewType: 'plugins.flutter.io/webview', - // WebView content is not affected by the Android view's layout direction, - // we explicitly set it here so that the widget doesn't require an ambient - // directionality. - layoutDirection: TextDirection.rtl, - creationParams: MethodChannelWebViewPlatform.creationParamsToMap( - creationParams, - ), - creationParamsCodec: const StandardMessageCodec(), - ) - ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) - ..addOnPlatformViewCreatedListener((int id) { - if (onWebViewPlatformCreated == null) { - return; - } - onWebViewPlatformCreated( - MethodChannelWebViewPlatform(id, webViewPlatformCallbacksHandler), - ); - }) - ..create(); - }, - ); - } - @override Future clearCookies() => MethodChannelWebViewPlatform.clearCookies(); } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index dedbff916a0a..1a5f8055eb36 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -6,11 +6,14 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'platform_interface.dart'; import 'src/webview_android.dart'; import 'src/webview_cupertino.dart'; +import 'src/webview_method_channel.dart'; /// Optional callback invoked when a web view is first created. [controller] is /// the [WebViewController] for the created web view. @@ -64,6 +67,60 @@ enum NavigationDecision { navigate, } +/// Android [WebViewPlatform] that uses [AndroidViewSurface] to build the [WebView] widget. +/// +/// To use this, set [WebView.platform] to an instance of this class. +class SurfaceAndroidWebView extends AndroidWebView { + @override + Widget build({ + BuildContext context, + CreationParams creationParams, + WebViewPlatformCreatedCallback onWebViewPlatformCreated, + Set> gestureRecognizers, + @required WebViewPlatformCallbacksHandler webViewPlatformCallbacksHandler, + }) { + assert(webViewPlatformCallbacksHandler != null); + return PlatformViewLink( + viewType: 'plugins.flutter.io/webview', + surfaceFactory: ( + BuildContext context, + PlatformViewController controller, + ) { + return AndroidViewSurface( + controller: controller, + gestureRecognizers: gestureRecognizers ?? + const >{}, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + ); + }, + onCreatePlatformView: (PlatformViewCreationParams params) { + return PlatformViewsService.initSurfaceAndroidView( + id: params.id, + viewType: 'plugins.flutter.io/webview', + // WebView content is not affected by the Android view's layout direction, + // we explicitly set it here so that the widget doesn't require an ambient + // directionality. + layoutDirection: TextDirection.rtl, + creationParams: MethodChannelWebViewPlatform.creationParamsToMap( + creationParams, + ), + creationParamsCodec: const StandardMessageCodec(), + ) + ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) + ..addOnPlatformViewCreatedListener((int id) { + if (onWebViewPlatformCreated == null) { + return; + } + onWebViewPlatformCreated( + MethodChannelWebViewPlatform(id, webViewPlatformCallbacksHandler), + ); + }) + ..create(); + }, + ); + } +} + /// Decides how to handle a specific navigation request. /// /// The returned [NavigationDecision] determines how the navigation described by @@ -156,7 +213,6 @@ class WebView extends StatefulWidget { this.userAgent, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, - this.useExperimentalAndroidSurfaceView = false, }) : assert(javascriptMode != null), assert(initialMediaPlaybackPolicy != null), super(key: key); @@ -330,16 +386,6 @@ class WebView extends StatefulWidget { /// The default policy is [AutoMediaPlaybackPolicy.require_user_action_for_all_media_types]. final AutoMediaPlaybackPolicy initialMediaPlaybackPolicy; - /// Whether to use `AndroidViewSurface` and `SurfaceAndroidViewController` to create the widget. - /// - /// This flag is temporary and is highly subject to removal. One should only - /// use this if they are willing to test [WebView] features that aren't - /// available in the standard version and acknowledges that it is possible - /// this can have slower performance and/or unpredictable bugs. - /// - /// Defaults to false. - final bool useExperimentalAndroidSurfaceView; - @override State createState() => _WebViewState(); } @@ -352,17 +398,7 @@ class _WebViewState extends State { @override Widget build(BuildContext context) { - final WebViewPlatform platform = WebView.platform; - if (widget.useExperimentalAndroidSurfaceView && platform is AndroidWebView) { - return platform.buildWithSurfaceView( - context: context, - onWebViewPlatformCreated: _onWebViewPlatformCreated, - webViewPlatformCallbacksHandler: _platformCallbacksHandler, - gestureRecognizers: widget.gestureRecognizers, - creationParams: _creationParamsfromWidget(widget), - ); - } - return platform.build( + return WebView.platform.build( context: context, onWebViewPlatformCreated: _onWebViewPlatformCreated, webViewPlatformCallbacksHandler: _platformCallbacksHandler, From da2a0b98626a96530d1d5d380f2743651a500f38 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 20 Jul 2020 09:00:35 -0700 Subject: [PATCH 4/8] Formatting and changelog --- packages/webview_flutter/CHANGELOG.md | 5 +++-- .../example/test_driver/webview_flutter_e2e.dart | 6 +++--- packages/webview_flutter/lib/webview_flutter.dart | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 3cc0eaf64523..7d434f45e3ad 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,7 +1,8 @@ ## 0.3.23 -* Add `Webview.useExperimentalAndroidSurfaceView` flag that builds Android WebView using hybrid views. - To use this feature, set this value to `true` and have the following lines in your `android/app/src/main/AndroidManifest.xml`: +* Add support for building `WebView` widget with Android hybrid views. To use this feature, set + `WebView.platform` to an instance of `SurfaceAndroidWebView` and add the following lines to your + `android/app/src/main/AndroidManifest.xml`: ```xml . diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart index bd38ca0c577a..07586a9481c4 100644 --- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart @@ -633,18 +633,18 @@ void main() { '''; final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); + base64Encode(const Utf8Encoder().convert(scrollTestPage)); final Completer pageLoaded = Completer(); final Completer controllerCompleter = - Completer(); + Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 1a5f8055eb36..3fe0d861174e 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -83,9 +83,9 @@ class SurfaceAndroidWebView extends AndroidWebView { return PlatformViewLink( viewType: 'plugins.flutter.io/webview', surfaceFactory: ( - BuildContext context, - PlatformViewController controller, - ) { + BuildContext context, + PlatformViewController controller, + ) { return AndroidViewSurface( controller: controller, gestureRecognizers: gestureRecognizers ?? From 29d2b88ed88c540479cd5505c1c447d0e14b9ef6 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 18 Sep 2020 10:26:34 -0700 Subject: [PATCH 5/8] test reformat and better documentation --- packages/webview_flutter/CHANGELOG.md | 14 +------------- .../android/app/src/main/AndroidManifest.xml | 4 ---- .../example/test_driver/webview_flutter_e2e.dart | 13 +++++++++---- .../webview_flutter/lib/src/webview_android.dart | 1 - packages/webview_flutter/lib/webview_flutter.dart | 6 ++++++ 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 9480af3c9b3e..514be4d978da 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,19 +1,7 @@ ## 0.3.23 * Add support for building `WebView` widget with Android hybrid views. To use this feature, set - `WebView.platform` to an instance of `SurfaceAndroidWebView` and add the following lines to your - `android/app/src/main/AndroidManifest.xml`: -```xml - -. -. - -. -. - -``` + `WebView.platform` to an instance of `SurfaceAndroidWebView`. ## 0.3.22+2 diff --git a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml index 52d6029f297d..f895f92bd7a4 100644 --- a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml @@ -13,10 +13,6 @@ - - @@ -676,8 +683,6 @@ void main() { scrollPosY = await controller.getScrollY(); expect(X_SCROLL * 2, scrollPosX); expect(Y_SCROLL * 2, scrollPosY); - - WebView.platform = null; }); }); diff --git a/packages/webview_flutter/lib/src/webview_android.dart b/packages/webview_flutter/lib/src/webview_android.dart index 059073932395..f7afcc0637a3 100644 --- a/packages/webview_flutter/lib/src/webview_android.dart +++ b/packages/webview_flutter/lib/src/webview_android.dart @@ -6,7 +6,6 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; -import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 3fe0d861174e..c3921e1f18dc 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -70,6 +70,12 @@ enum NavigationDecision { /// Android [WebViewPlatform] that uses [AndroidViewSurface] to build the [WebView] widget. /// /// To use this, set [WebView.platform] to an instance of this class. +/// +/// This implementation uses Hybrid Composition to render the [WebView] on +/// Android. It solves multiple issues related to accessibility and interacting +/// with the [WebView] at the cost of some performance on Android version below +/// 10. See https://github.com/flutter/flutter/issues/61133 for more +/// information. class SurfaceAndroidWebView extends AndroidWebView { @override Widget build({ From 7c30a7ecbbcad3abe6223feb656b861838165d65 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 18 Sep 2020 10:32:39 -0700 Subject: [PATCH 6/8] slight doc change --- packages/webview_flutter/lib/webview_flutter.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index c3921e1f18dc..b15eb330463c 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -72,8 +72,8 @@ enum NavigationDecision { /// To use this, set [WebView.platform] to an instance of this class. /// /// This implementation uses Hybrid Composition to render the [WebView] on -/// Android. It solves multiple issues related to accessibility and interacting -/// with the [WebView] at the cost of some performance on Android version below +/// Android. It solves multiple issues related to accessibility and interaction +/// with the [WebView] at the cost of some performance on Android versions below /// 10. See https://github.com/flutter/flutter/issues/61133 for more /// information. class SurfaceAndroidWebView extends AndroidWebView { From c82be0a2283dd7392c151351168e4d77267f6fe0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 21 Sep 2020 12:50:19 -0700 Subject: [PATCH 7/8] update docs/changelog and hopefully fix ios --- packages/webview_flutter/CHANGELOG.md | 21 ++++++++++++++++++- .../webview_flutter/example/lib/main.dart | 3 ++- .../webview_flutter/lib/webview_flutter.dart | 4 ++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 41ee93961a42..2b5bb7e45152 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,7 +1,26 @@ ## 0.3.24 * Add support for building `WebView` widget with Android hybrid views. To use this feature, set - `WebView.platform` to an instance of `SurfaceAndroidWebView`. + `WebView.platform` to an instance of `SurfaceAndroidWebView`. For example: + +```dart +import 'dart:io'; + +class WebViewExample extends StatefulWidget { + @override + void initState() { + super.initState(); + if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); + } + + @override + Widget build(BuildContext context) { + return WebView( + initialUrl: 'https://flutter.dev', + ); + } +} +``` ## 0.3.23 diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 42c437d00dc1..ff25e8a16c9b 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -38,7 +39,7 @@ class _WebViewExampleState extends State { @override void initState() { super.initState(); - WebView.platform = SurfaceAndroidWebView(); + if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); } @override diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index b15eb330463c..5e2bffd6539d 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -71,10 +71,10 @@ enum NavigationDecision { /// /// To use this, set [WebView.platform] to an instance of this class. /// -/// This implementation uses Hybrid Composition to render the [WebView] on +/// This implementation uses hybrid composition to render the [WebView] on /// Android. It solves multiple issues related to accessibility and interaction /// with the [WebView] at the cost of some performance on Android versions below -/// 10. See https://github.com/flutter/flutter/issues/61133 for more +/// 10. See https://github.com/flutter/flutter/wiki/Hybrid-Composition for more /// information. class SurfaceAndroidWebView extends AndroidWebView { @override From 28faa1a21d9b1ffc8a459775a478eaa3b9199d92 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 21 Sep 2020 12:56:42 -0700 Subject: [PATCH 8/8] fix ios test --- .../example/test_driver/webview_flutter_e2e.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart index a08a54a2554f..2a17c53a4c3f 100644 --- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart @@ -684,7 +684,7 @@ void main() { expect(X_SCROLL * 2, scrollPosX); expect(Y_SCROLL * 2, scrollPosY); }); - }); + }, skip: !Platform.isAndroid); group('NavigationDelegate', () { final String blankPage = "";