[android_webview_controller] Fixes bug where an `AndroidController` couldn't be reused (#6910)
* the fix
* change location of setting pageLoaded
* destroy webview when removed from system
diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
index b5502ec..d45e735 100644
--- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.1.2
+
+* Fixes bug where an `AndroidWebViewController` couldn't be reused with a new `WebViewWidget`.
+
## 3.1.1
* Fixes bug where a `AndroidNavigationDelegate` was required to load a request.
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java
index 978e523..9cbf65b 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java
@@ -27,6 +27,10 @@
@Override
public void dispose(@NonNull Long identifier) {
+ final Object instance = instanceManager.getInstance(identifier);
+ if (instance instanceof WebViewHostApiImpl.WebViewPlatformView) {
+ ((WebViewHostApiImpl.WebViewPlatformView) instance).destroy();
+ }
instanceManager.remove(identifier);
}
}
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java
index 0a044cc..77d535b 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java
@@ -102,9 +102,7 @@
}
@Override
- public void dispose() {
- destroy();
- }
+ public void dispose() {}
@Override
public void setWebViewClient(WebViewClient webViewClient) {
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java
index c49d6c5..1721ccd 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java
@@ -281,4 +281,37 @@
// This shouldn't throw an Exception.
Objects.requireNonNull(webView.getWebChromeClient()).onProgressChanged(webView, 0);
}
+
+ @Test
+ public void disposeDoesNotCallDestroy() {
+ final boolean[] destroyCalled = {false};
+ final WebViewPlatformView webView =
+ new WebViewPlatformView(mockContext, null, null) {
+ @Override
+ public void destroy() {
+ destroyCalled[0] = true;
+ }
+ };
+ webView.dispose();
+
+ assertFalse(destroyCalled[0]);
+ }
+
+ @Test
+ public void destroyWebViewWhenDisposedFromJavaObjectHostApi() {
+ final boolean[] destroyCalled = {false};
+ final WebViewPlatformView webView =
+ new WebViewPlatformView(mockContext, null, null) {
+ @Override
+ public void destroy() {
+ destroyCalled[0] = true;
+ }
+ };
+
+ testInstanceManager.addDartCreatedInstance(webView, 0);
+ final JavaObjectHostApiImpl javaObjectHostApi = new JavaObjectHostApiImpl(testInstanceManager);
+ javaObjectHostApi.dispose(0L);
+
+ assertTrue(destroyCalled[0]);
+ }
}
diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
index dcd1dea..f6a55b1 100644
--- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
@@ -1018,6 +1018,51 @@
expect(elementText, 'null');
},
);
+
+ testWidgets(
+ '`AndroidWebViewController` can be reused with a new `AndroidWebViewWidget`',
+ (WidgetTester tester) async {
+ Completer<void> pageLoaded = Completer<void>();
+
+ final PlatformWebViewController controller = PlatformWebViewController(
+ const PlatformWebViewControllerCreationParams(),
+ )
+ ..setPlatformNavigationDelegate(PlatformNavigationDelegate(
+ const PlatformNavigationDelegateCreationParams(),
+ )..setOnPageFinished((_) => pageLoaded.complete()))
+ ..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl)));
+
+ await tester.pumpWidget(Builder(
+ builder: (BuildContext context) {
+ return PlatformWebViewWidget(
+ PlatformWebViewWidgetCreationParams(controller: controller),
+ ).build(context);
+ },
+ ));
+
+ await pageLoaded.future;
+
+ await tester.pumpWidget(Container());
+ await tester.pumpAndSettle();
+
+ await tester.pumpWidget(Builder(
+ builder: (BuildContext context) {
+ return PlatformWebViewWidget(
+ PlatformWebViewWidgetCreationParams(controller: controller),
+ ).build(context);
+ },
+ ));
+
+ pageLoaded = Completer<void>();
+ await controller.loadRequest(
+ LoadRequestParams(uri: Uri.parse(primaryUrl)),
+ );
+ await expectLater(
+ pageLoaded.future,
+ completes,
+ );
+ },
+ );
}
/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.
diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
index 72bc2e4..57346e1 100644
--- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget on Android.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 3.1.1
+version: 3.1.2
environment:
sdk: ">=2.17.0 <3.0.0"