diff --git a/packages/flutter/lib/src/rendering/platform_view.dart b/packages/flutter/lib/src/rendering/platform_view.dart index b1700fc6f8..3f0a772721 100644 --- a/packages/flutter/lib/src/rendering/platform_view.dart +++ b/packages/flutter/lib/src/rendering/platform_view.dart @@ -320,10 +320,13 @@ class RenderUiKitView extends RenderBox { /// must have been created by calling [PlatformViewsService.initUiKitView]. UiKitViewController get viewController => _viewController; UiKitViewController _viewController; - set viewController(UiKitViewController viewController) { - assert(viewController != null); - final bool needsSemanticsUpdate = _viewController.id != viewController.id; - _viewController = viewController; + set viewController(UiKitViewController value) { + assert(value != null); + if (_viewController == value) { + return; + } + final bool needsSemanticsUpdate = _viewController.id != value.id; + _viewController = value; markNeedsPaint(); if (needsSemanticsUpdate) { markNeedsSemanticsUpdate(); diff --git a/packages/flutter/test/rendering/platform_view_test.dart b/packages/flutter/test/rendering/platform_view_test.dart index 9f3d2b26bd..b05fe53184 100644 --- a/packages/flutter/test/rendering/platform_view_test.dart +++ b/packages/flutter/test/rendering/platform_view_test.dart @@ -260,6 +260,42 @@ void main() { expect(renderBox.debugLayer, isNull); }); }); + + test('markNeedsPaint does not get called when setting the same viewController', () { + FakeAsync().run((FakeAsync async) { + final Completer viewCreation = Completer(); + const MethodChannel channel = MethodChannel('flutter/platform_views'); + binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, (MethodCall methodCall) async { + assert(methodCall.method == 'create', 'Unexpected method call'); + await viewCreation.future; + return /*textureId=*/ 0; + }); + + bool futureCallbackRan = false; + + PlatformViewsService.initUiKitView(id: 0, viewType: 'webview', layoutDirection: TextDirection.ltr).then((UiKitViewController viewController) { + final RenderUiKitView renderBox = RenderUiKitView( + viewController: viewController, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + gestureRecognizers: >{}, + ); + + layout(renderBox); + pumpFrame(phase: EnginePhase.paint); + expect(renderBox.debugNeedsPaint, isFalse); + + renderBox.viewController = viewController; + + expect(renderBox.debugNeedsPaint, isFalse); + + futureCallbackRan = true; + }); + + viewCreation.complete(); + async.flushMicrotasks(); + expect(futureCallbackRan, true); + }); + }); } ui.PointerData _pointerData(