mirror of
https://github.com/flutter/packages.git
synced 2025-06-28 22:02:38 +08:00
[webview_flutter_android][webview_flutter_wkwebview] Fixes widget rebuild bug caused by key type (#4667)
It looks like the wrong key was used in https://github.com/flutter/packages/pull/4533. The `ObjectKey` uses `identical` for comparison while `ValueKey` uses `==`, which is what was intended. This just switches the key type on both platforms. Fixes https://github.com/flutter/flutter/issues/131697 Fixes https://github.com/flutter/flutter/issues/132143
This commit is contained in:
@ -1,3 +1,7 @@
|
|||||||
|
## 3.9.3
|
||||||
|
|
||||||
|
* Fixes bug where the `PlatformWebViewWidget` was rebuilt unnecessarily.
|
||||||
|
|
||||||
## 3.9.2
|
## 3.9.2
|
||||||
|
|
||||||
* Fixes bug where `PlatformWebViewWidget` doesn't rebuild when the controller or PlatformView
|
* Fixes bug where `PlatformWebViewWidget` doesn't rebuild when the controller or PlatformView
|
||||||
|
@ -784,7 +784,9 @@ class AndroidWebViewWidget extends PlatformWebViewWidget {
|
|||||||
return PlatformViewLink(
|
return PlatformViewLink(
|
||||||
// Setting a default key using `params` ensures the `PlatformViewLink`
|
// Setting a default key using `params` ensures the `PlatformViewLink`
|
||||||
// recreates the PlatformView when changes are made.
|
// recreates the PlatformView when changes are made.
|
||||||
key: _androidParams.key ?? ObjectKey(params),
|
key: _androidParams.key ??
|
||||||
|
ValueKey<AndroidWebViewWidgetCreationParams>(
|
||||||
|
params as AndroidWebViewWidgetCreationParams),
|
||||||
viewType: 'plugins.flutter.io/webview',
|
viewType: 'plugins.flutter.io/webview',
|
||||||
surfaceFactory: (
|
surfaceFactory: (
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
|
@ -2,7 +2,7 @@ name: webview_flutter_android
|
|||||||
description: A Flutter plugin that provides a WebView widget on Android.
|
description: A Flutter plugin that provides a WebView widget on Android.
|
||||||
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android
|
repository: https://github.com/flutter/packages/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
|
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
|
||||||
version: 3.9.2
|
version: 3.9.3
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.18.0 <4.0.0"
|
sdk: ">=2.18.0 <4.0.0"
|
||||||
|
@ -1279,5 +1279,71 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'PlatformView does not rebuild when creation params stay the same',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final MockPlatformViewsServiceProxy mockPlatformViewsService =
|
||||||
|
MockPlatformViewsServiceProxy();
|
||||||
|
|
||||||
|
final AndroidWebViewController controller = createControllerWithMocks();
|
||||||
|
|
||||||
|
when(
|
||||||
|
mockPlatformViewsService.initSurfaceAndroidView(
|
||||||
|
id: anyNamed('id'),
|
||||||
|
viewType: anyNamed('viewType'),
|
||||||
|
layoutDirection: anyNamed('layoutDirection'),
|
||||||
|
creationParams: anyNamed('creationParams'),
|
||||||
|
creationParamsCodec: anyNamed('creationParamsCodec'),
|
||||||
|
onFocus: anyNamed('onFocus'),
|
||||||
|
),
|
||||||
|
).thenReturn(MockSurfaceAndroidViewController());
|
||||||
|
|
||||||
|
await tester.pumpWidget(Builder(
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AndroidWebViewWidget(
|
||||||
|
AndroidWebViewWidgetCreationParams(
|
||||||
|
controller: controller,
|
||||||
|
platformViewsServiceProxy: mockPlatformViewsService,
|
||||||
|
),
|
||||||
|
).build(context);
|
||||||
|
},
|
||||||
|
));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
verify(
|
||||||
|
mockPlatformViewsService.initSurfaceAndroidView(
|
||||||
|
id: anyNamed('id'),
|
||||||
|
viewType: anyNamed('viewType'),
|
||||||
|
layoutDirection: anyNamed('layoutDirection'),
|
||||||
|
creationParams: anyNamed('creationParams'),
|
||||||
|
creationParamsCodec: anyNamed('creationParamsCodec'),
|
||||||
|
onFocus: anyNamed('onFocus'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.pumpWidget(Builder(
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AndroidWebViewWidget(
|
||||||
|
AndroidWebViewWidgetCreationParams(
|
||||||
|
controller: controller,
|
||||||
|
platformViewsServiceProxy: mockPlatformViewsService,
|
||||||
|
),
|
||||||
|
).build(context);
|
||||||
|
},
|
||||||
|
));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
verifyNever(
|
||||||
|
mockPlatformViewsService.initSurfaceAndroidView(
|
||||||
|
id: anyNamed('id'),
|
||||||
|
viewType: anyNamed('viewType'),
|
||||||
|
layoutDirection: anyNamed('layoutDirection'),
|
||||||
|
creationParams: anyNamed('creationParams'),
|
||||||
|
creationParamsCodec: anyNamed('creationParamsCodec'),
|
||||||
|
onFocus: anyNamed('onFocus'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
## 3.7.3
|
||||||
|
|
||||||
|
* Fixes bug where the `PlatformWebViewWidget` was rebuilt unnecessarily.
|
||||||
|
|
||||||
## 3.7.2
|
## 3.7.2
|
||||||
|
|
||||||
* Fixes bug where `PlatformWebViewWidget` doesn't rebuild when the controller changes.
|
* Fixes bug where `PlatformWebViewWidget` doesn't rebuild when the controller changes.
|
||||||
|
@ -668,7 +668,9 @@ class WebKitWebViewWidget extends PlatformWebViewWidget {
|
|||||||
return UiKitView(
|
return UiKitView(
|
||||||
// Setting a default key using `params` ensures the `UIKitView` recreates
|
// Setting a default key using `params` ensures the `UIKitView` recreates
|
||||||
// the PlatformView when changes are made.
|
// the PlatformView when changes are made.
|
||||||
key: _webKitParams.key ?? ObjectKey(params),
|
key: _webKitParams.key ??
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
params as WebKitWebViewWidgetCreationParams),
|
||||||
viewType: 'plugins.flutter.io/webview',
|
viewType: 'plugins.flutter.io/webview',
|
||||||
onPlatformViewCreated: (_) {},
|
onPlatformViewCreated: (_) {},
|
||||||
layoutDirection: params.layoutDirection,
|
layoutDirection: params.layoutDirection,
|
||||||
|
@ -2,7 +2,7 @@ name: webview_flutter_wkwebview
|
|||||||
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
|
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
|
||||||
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
|
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
|
||||||
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
|
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
|
||||||
version: 3.7.2
|
version: 3.7.3
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.18.0 <4.0.0"
|
sdk: ">=2.18.0 <4.0.0"
|
||||||
|
@ -66,7 +66,14 @@ void main() {
|
|||||||
);
|
);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
expect(find.byKey(ObjectKey(webViewWidget.params)), findsOneWidget);
|
expect(
|
||||||
|
find.byKey(
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
webViewWidget.params as WebKitWebViewWidgetCreationParams,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
findsOneWidget,
|
||||||
|
);
|
||||||
|
|
||||||
// Pump WebViewWidget with second controller.
|
// Pump WebViewWidget with second controller.
|
||||||
final WebKitWebViewController controller2 =
|
final WebKitWebViewController controller2 =
|
||||||
@ -85,7 +92,81 @@ void main() {
|
|||||||
);
|
);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
expect(find.byKey(ObjectKey(webViewWidget2.params)), findsOneWidget);
|
expect(webViewWidget.params != webViewWidget2.params, isTrue);
|
||||||
|
expect(
|
||||||
|
find.byKey(
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
webViewWidget.params as WebKitWebViewWidgetCreationParams,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
findsNothing,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
find.byKey(
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
webViewWidget2.params as WebKitWebViewWidgetCreationParams,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
findsOneWidget,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'Key of the PlatformView is the same when the creation params are equal',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final InstanceManager testInstanceManager = InstanceManager(
|
||||||
|
onWeakReferenceRemoved: (_) {},
|
||||||
|
);
|
||||||
|
|
||||||
|
final WebKitWebViewController controller =
|
||||||
|
createTestWebViewController(testInstanceManager);
|
||||||
|
|
||||||
|
final WebKitWebViewWidget webViewWidget = WebKitWebViewWidget(
|
||||||
|
WebKitWebViewWidgetCreationParams(
|
||||||
|
controller: controller,
|
||||||
|
instanceManager: testInstanceManager,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Builder(
|
||||||
|
builder: (BuildContext context) => webViewWidget.build(context),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
expect(
|
||||||
|
find.byKey(
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
webViewWidget.params as WebKitWebViewWidgetCreationParams,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
findsOneWidget,
|
||||||
|
);
|
||||||
|
|
||||||
|
final WebKitWebViewWidget webViewWidget2 = WebKitWebViewWidget(
|
||||||
|
WebKitWebViewWidgetCreationParams(
|
||||||
|
controller: controller,
|
||||||
|
instanceManager: testInstanceManager,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Builder(
|
||||||
|
builder: (BuildContext context) => webViewWidget2.build(context),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
// Can find the new widget with the key of the first widget.
|
||||||
|
expect(
|
||||||
|
find.byKey(
|
||||||
|
ValueKey<WebKitWebViewWidgetCreationParams>(
|
||||||
|
webViewWidget.params as WebKitWebViewWidgetCreationParams,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
findsOneWidget,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user