Skip to content

Commit 4ead92c

Browse files
authored
Fix UiKitView which wrongly unconditionally repaints (#111790)
1 parent 88707f7 commit 4ead92c

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

packages/flutter/lib/src/rendering/platform_view.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,13 @@ class RenderUiKitView extends RenderBox {
320320
/// must have been created by calling [PlatformViewsService.initUiKitView].
321321
UiKitViewController get viewController => _viewController;
322322
UiKitViewController _viewController;
323-
set viewController(UiKitViewController viewController) {
324-
assert(viewController != null);
325-
final bool needsSemanticsUpdate = _viewController.id != viewController.id;
326-
_viewController = viewController;
323+
set viewController(UiKitViewController value) {
324+
assert(value != null);
325+
if (_viewController == value) {
326+
return;
327+
}
328+
final bool needsSemanticsUpdate = _viewController.id != value.id;
329+
_viewController = value;
327330
markNeedsPaint();
328331
if (needsSemanticsUpdate) {
329332
markNeedsSemanticsUpdate();

packages/flutter/test/rendering/platform_view_test.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,42 @@ void main() {
260260
expect(renderBox.debugLayer, isNull);
261261
});
262262
});
263+
264+
test('markNeedsPaint does not get called when setting the same viewController', () {
265+
FakeAsync().run((FakeAsync async) {
266+
final Completer<void> viewCreation = Completer<void>();
267+
const MethodChannel channel = MethodChannel('flutter/platform_views');
268+
binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, (MethodCall methodCall) async {
269+
assert(methodCall.method == 'create', 'Unexpected method call');
270+
await viewCreation.future;
271+
return /*textureId=*/ 0;
272+
});
273+
274+
bool futureCallbackRan = false;
275+
276+
PlatformViewsService.initUiKitView(id: 0, viewType: 'webview', layoutDirection: TextDirection.ltr).then((UiKitViewController viewController) {
277+
final RenderUiKitView renderBox = RenderUiKitView(
278+
viewController: viewController,
279+
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
280+
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{},
281+
);
282+
283+
layout(renderBox);
284+
pumpFrame(phase: EnginePhase.paint);
285+
expect(renderBox.debugNeedsPaint, isFalse);
286+
287+
renderBox.viewController = viewController;
288+
289+
expect(renderBox.debugNeedsPaint, isFalse);
290+
291+
futureCallbackRan = true;
292+
});
293+
294+
viewCreation.complete();
295+
async.flushMicrotasks();
296+
expect(futureCallbackRan, true);
297+
});
298+
});
263299
}
264300

265301
ui.PointerData _pointerData(

0 commit comments

Comments
 (0)