diff --git a/README.md b/README.md
index 780af7b2..18c3f425 100755
--- a/README.md
+++ b/README.md
@@ -545,6 +545,7 @@ Instead, on the `onLoadStop` WebView event, you can use `callHandler` directly:
##### `InAppWebView` Android-specific options
+* `useHybridComposition`: Set to `true` to use Flutter's new Hybrid Composition rendering method, which fixes all issues [here](https://github.com/flutter/flutter/issues/61133). The default value is `false`. Note that this option requires Flutter v1.20+ and should only be used on Android 10+ for release apps, as animations will drop frames on < Android 10.
* `useShouldInterceptRequest`: Set to `true` to be able to listen at the `androidShouldInterceptRequest` event. The default value is `false`.
* `useOnRenderProcessGone`: Set to `true` to be able to listen at the `androidOnRenderProcessGone` event. The default value is `false`.
* `textZoom`: Sets the text zoom of the page in percent. The default value is `100`.
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index d0d8adfc..a7309e1e 100755
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -5,6 +5,8 @@
+
-
\ No newline at end of file
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
index b6bd289b..fefd2bec 100755
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -85,5 +85,11 @@
android:resource="@xml/provider_paths"/>
+
+
+
+
diff --git a/lib/src/in_app_webview.dart b/lib/src/in_app_webview.dart
index c031c3f3..f211b3f6 100755
--- a/lib/src/in_app_webview.dart
+++ b/lib/src/in_app_webview.dart
@@ -3,6 +3,7 @@ import 'dart:typed_data';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
+import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/gestures.dart';
@@ -339,27 +340,42 @@ class _InAppWebViewState extends State {
@override
Widget build(BuildContext context) {
if (defaultTargetPlatform == TargetPlatform.android) {
- return AndroidView(
- viewType: 'com.pichillilorenzo/flutter_inappwebview',
- onPlatformViewCreated: _onPlatformViewCreated,
- gestureRecognizers: widget.gestureRecognizers,
- layoutDirection: TextDirection.rtl,
- creationParams: {
- 'initialUrl': '${Uri.parse(widget.initialUrl)}',
- 'initialFile': widget.initialFile,
- 'initialData': widget.initialData?.toMap(),
- 'initialHeaders': widget.initialHeaders,
- 'initialOptions': widget.initialOptions?.toMap() ?? {},
- 'contextMenu': widget.contextMenu?.toMap() ?? {},
- 'windowId': widget.windowId
- },
- creationParamsCodec: const StandardMessageCodec(),
- );
- // onLongPress issue: https://github.com/flutter/plugins/blob/f31d16a6ca0c4bd6849cff925a00b6823973696b/packages/webview_flutter/lib/src/webview_android.dart#L31
- /*return GestureDetector(
- onLongPress: () {},
- excludeFromSemantics: true,
- child: AndroidView(
+ if (widget.initialOptions.android.useHybridComposition) {
+ return PlatformViewLink(
+ viewType: 'com.pichillilorenzo/flutter_inappwebview',
+ surfaceFactory: (
+ BuildContext context,
+ PlatformViewController controller,
+ ) {
+ return AndroidViewSurface(
+ controller: controller,
+ gestureRecognizers: widget.gestureRecognizers ?? const >{},
+ hitTestBehavior: PlatformViewHitTestBehavior.opaque,
+ );
+ },
+ onCreatePlatformView: (PlatformViewCreationParams params) {
+ return PlatformViewsService.initSurfaceAndroidView(
+ id: params.id,
+ viewType: 'com.pichillilorenzo/flutter_inappwebview',
+ layoutDirection: TextDirection.rtl,
+ creationParams: {
+ 'initialUrl': '${Uri.parse(widget.initialUrl)}',
+ 'initialFile': widget.initialFile,
+ 'initialData': widget.initialData?.toMap(),
+ 'initialHeaders': widget.initialHeaders,
+ 'initialOptions': widget.initialOptions?.toMap() ?? {},
+ 'contextMenu': widget.contextMenu?.toMap() ?? {},
+ 'windowId': widget.windowId
+ },
+ creationParamsCodec: const StandardMessageCodec(),
+ )
+ ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
+ ..addOnPlatformViewCreatedListener((id) => _onPlatformViewCreated(id))
+ ..create();
+ },
+ );
+ } else {
+ return AndroidView(
viewType: 'com.pichillilorenzo/flutter_inappwebview',
onPlatformViewCreated: _onPlatformViewCreated,
gestureRecognizers: widget.gestureRecognizers,
@@ -369,11 +385,13 @@ class _InAppWebViewState extends State {
'initialFile': widget.initialFile,
'initialData': widget.initialData?.toMap(),
'initialHeaders': widget.initialHeaders,
- 'initialOptions': initialOptions
+ 'initialOptions': widget.initialOptions?.toMap() ?? {},
+ 'contextMenu': widget.contextMenu?.toMap() ?? {},
+ 'windowId': widget.windowId
},
creationParamsCodec: const StandardMessageCodec(),
- ),
- );*/
+ );
+ }
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
return UiKitView(
viewType: 'com.pichillilorenzo/flutter_inappwebview',
diff --git a/lib/src/webview_options.dart b/lib/src/webview_options.dart
index 506dd7c0..046f9908 100755
--- a/lib/src/webview_options.dart
+++ b/lib/src/webview_options.dart
@@ -470,6 +470,11 @@ class AndroidInAppWebViewOptions
///If the url request of a subframe matches the regular expression, then the request of that subframe is canceled.
String regexToCancelSubFramesLoading;
+ ///Set to `true` to enable Flutter's new Hybrid Composition. The default value is `false`.
+ ///Hybrid Composition is supported starting with Flutter v1.20.
+ ///**NOTE**: It is recommended to use Hybrid Composition only on Android 10+ for a release app, as it can cause framerate drops on animations in Android 9 and lower.
+ bool useHybridComposition;
+
///Set to `true` to be able to listen at the [WebView.androidShouldInterceptRequest] event. The default value is `false`.
bool useShouldInterceptRequest;
@@ -556,6 +561,7 @@ class AndroidInAppWebViewOptions
this.initialScale = 0,
this.supportMultipleWindows = false,
this.regexToCancelSubFramesLoading,
+ this.useHybridComposition = false,
this.useShouldInterceptRequest = false,
this.useOnRenderProcessGone = false,
this.overScrollMode = AndroidOverScrollMode.OVER_SCROLL_IF_CONTENT_SCROLLS,
@@ -613,6 +619,7 @@ class AndroidInAppWebViewOptions
"thirdPartyCookiesEnabled": thirdPartyCookiesEnabled,
"hardwareAcceleration": hardwareAcceleration,
"supportMultipleWindows": supportMultipleWindows,
+ "useHybridComposition": useHybridComposition,
"regexToCancelSubFramesLoading": regexToCancelSubFramesLoading,
"useShouldInterceptRequest": useShouldInterceptRequest,
"useOnRenderProcessGone": useOnRenderProcessGone,
@@ -676,6 +683,7 @@ class AndroidInAppWebViewOptions
options.supportMultipleWindows = map["supportMultipleWindows"];
options.regexToCancelSubFramesLoading =
map["regexToCancelSubFramesLoading"];
+ options.useHybridComposition = map["useHybridComposition"];
options.useShouldInterceptRequest = map["useShouldInterceptRequest"];
options.useOnRenderProcessGone = map["useOnRenderProcessGone"];
options.overScrollMode =