[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"