Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit f36fa64

Browse files
[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
1 parent f80aabf commit f36fa64

File tree

6 files changed

+88
-4
lines changed

6 files changed

+88
-4
lines changed

packages/webview_flutter/webview_flutter_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 3.1.2
2+
3+
* Fixes bug where an `AndroidWebViewController` couldn't be reused with a new `WebViewWidget`.
4+
15
## 3.1.1
26

37
* Fixes bug where a `AndroidNavigationDelegate` was required to load a request.

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public JavaObjectHostApiImpl(InstanceManager instanceManager) {
2727

2828
@Override
2929
public void dispose(@NonNull Long identifier) {
30+
final Object instance = instanceManager.getInstance(identifier);
31+
if (instance instanceof WebViewHostApiImpl.WebViewPlatformView) {
32+
((WebViewHostApiImpl.WebViewPlatformView) instance).destroy();
33+
}
3034
instanceManager.remove(identifier);
3135
}
3236
}

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,7 @@ public View getView() {
102102
}
103103

104104
@Override
105-
public void dispose() {
106-
destroy();
107-
}
105+
public void dispose() {}
108106

109107
@Override
110108
public void setWebViewClient(WebViewClient webViewClient) {

packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,4 +281,37 @@ public void defaultWebChromeClientDoesNotAttemptToCommunicateWithDart() {
281281
// This shouldn't throw an Exception.
282282
Objects.requireNonNull(webView.getWebChromeClient()).onProgressChanged(webView, 0);
283283
}
284+
285+
@Test
286+
public void disposeDoesNotCallDestroy() {
287+
final boolean[] destroyCalled = {false};
288+
final WebViewPlatformView webView =
289+
new WebViewPlatformView(mockContext, null, null) {
290+
@Override
291+
public void destroy() {
292+
destroyCalled[0] = true;
293+
}
294+
};
295+
webView.dispose();
296+
297+
assertFalse(destroyCalled[0]);
298+
}
299+
300+
@Test
301+
public void destroyWebViewWhenDisposedFromJavaObjectHostApi() {
302+
final boolean[] destroyCalled = {false};
303+
final WebViewPlatformView webView =
304+
new WebViewPlatformView(mockContext, null, null) {
305+
@Override
306+
public void destroy() {
307+
destroyCalled[0] = true;
308+
}
309+
};
310+
311+
testInstanceManager.addDartCreatedInstance(webView, 0);
312+
final JavaObjectHostApiImpl javaObjectHostApi = new JavaObjectHostApiImpl(testInstanceManager);
313+
javaObjectHostApi.dispose(0L);
314+
315+
assertTrue(destroyCalled[0]);
316+
}
284317
}

packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,51 @@ Future<void> main() async {
10181018
expect(elementText, 'null');
10191019
},
10201020
);
1021+
1022+
testWidgets(
1023+
'`AndroidWebViewController` can be reused with a new `AndroidWebViewWidget`',
1024+
(WidgetTester tester) async {
1025+
Completer<void> pageLoaded = Completer<void>();
1026+
1027+
final PlatformWebViewController controller = PlatformWebViewController(
1028+
const PlatformWebViewControllerCreationParams(),
1029+
)
1030+
..setPlatformNavigationDelegate(PlatformNavigationDelegate(
1031+
const PlatformNavigationDelegateCreationParams(),
1032+
)..setOnPageFinished((_) => pageLoaded.complete()))
1033+
..loadRequest(LoadRequestParams(uri: Uri.parse(primaryUrl)));
1034+
1035+
await tester.pumpWidget(Builder(
1036+
builder: (BuildContext context) {
1037+
return PlatformWebViewWidget(
1038+
PlatformWebViewWidgetCreationParams(controller: controller),
1039+
).build(context);
1040+
},
1041+
));
1042+
1043+
await pageLoaded.future;
1044+
1045+
await tester.pumpWidget(Container());
1046+
await tester.pumpAndSettle();
1047+
1048+
await tester.pumpWidget(Builder(
1049+
builder: (BuildContext context) {
1050+
return PlatformWebViewWidget(
1051+
PlatformWebViewWidgetCreationParams(controller: controller),
1052+
).build(context);
1053+
},
1054+
));
1055+
1056+
pageLoaded = Completer<void>();
1057+
await controller.loadRequest(
1058+
LoadRequestParams(uri: Uri.parse(primaryUrl)),
1059+
);
1060+
await expectLater(
1061+
pageLoaded.future,
1062+
completes,
1063+
);
1064+
},
1065+
);
10211066
}
10221067

10231068
/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.

packages/webview_flutter/webview_flutter_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_android
22
description: A Flutter plugin that provides a WebView widget on Android.
33
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 3.1.1
5+
version: 3.1.2
66

77
environment:
88
sdk: ">=2.17.0 <3.0.0"

0 commit comments

Comments
 (0)