From ed90d05596d85b0ec8e841395bce9d3b6edea134 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Tue, 14 May 2019 17:09:29 -0700 Subject: [PATCH] Fix needsCompositing propagation from child widgets. (#32717) This fixes propagation of needsCompositing from child widgets. When needsCompositing is turned on by a child widget, it necessarily sets the needsCompositing bit of its parent widget, but RenderPointerListener was ignoring that piece of information and only turning on compositing if it thought it needed it for itself. This corrects that, and adds a test for the condition, and updates a test that was affected by the change. Fixes #32525 (again) --- .../flutter/lib/src/rendering/proxy_box.dart | 2 +- .../flutter/test/widgets/keep_alive_test.dart | 6 +++++ .../flutter/test/widgets/listener_test.dart | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 7f0cf9dbab..3a059c2b9a 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -2654,7 +2654,7 @@ class RenderPointerListener extends RenderProxyBoxWithHitTestBehavior { bool get _hasActiveAnnotation => _hoverAnnotation != null && _mouseIsConnected; @override - bool get needsCompositing => _hasActiveAnnotation; + bool get needsCompositing => super.needsCompositing || _hasActiveAnnotation; @override void paint(PaintingContext context, Offset offset) { diff --git a/packages/flutter/test/widgets/keep_alive_test.dart b/packages/flutter/test/widgets/keep_alive_test.dart index 15e39a3ad2..f74307a460 100644 --- a/packages/flutter/test/widgets/keep_alive_test.dart +++ b/packages/flutter/test/widgets/keep_alive_test.dart @@ -234,12 +234,14 @@ void main() { ' │ repaints)\n' ' │\n' ' └─child: _RenderScrollSemantics#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ semantic boundary\n' ' │ size: Size(800.0, 600.0)\n' ' │\n' ' └─child: RenderPointerListener#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ size: Size(800.0, 600.0)\n' @@ -247,6 +249,7 @@ void main() { ' │ listeners: signal\n' ' │\n' ' └─child: RenderSemanticsGestureHandler#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ size: Size(800.0, 600.0)\n' @@ -377,12 +380,14 @@ void main() { ' │ repaints)\n' ' │\n' ' └─child: _RenderScrollSemantics#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ semantic boundary\n' ' │ size: Size(800.0, 600.0)\n' ' │\n' ' └─child: RenderPointerListener#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ size: Size(800.0, 600.0)\n' @@ -390,6 +395,7 @@ void main() { ' │ listeners: signal\n' ' │\n' ' └─child: RenderSemanticsGestureHandler#00000\n' + ' │ needs compositing\n' ' │ parentData: (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ size: Size(800.0, 600.0)\n' diff --git a/packages/flutter/test/widgets/listener_test.dart b/packages/flutter/test/widgets/listener_test.dart index aba698004f..b4da4b5d40 100644 --- a/packages/flutter/test/widgets/listener_test.dart +++ b/packages/flutter/test/widgets/listener_test.dart @@ -391,6 +391,28 @@ void main() { await gesture.removePointer(); }); + testWidgets('needsCompositing set when parent class needsCompositing is set', (WidgetTester tester) async { + await tester.pumpWidget( + Listener( + onPointerEnter: (PointerEnterEvent _) {}, + child: const Opacity(opacity: 0.5, child: Placeholder()), + ), + ); + + RenderPointerListener listener = tester.renderObject(find.byType(Listener).first); + expect(listener.needsCompositing, isTrue); + + await tester.pumpWidget( + Listener( + onPointerEnter: (PointerEnterEvent _) {}, + child: const Placeholder(), + ), + ); + + listener = tester.renderObject(find.byType(Listener).first); + expect(listener.needsCompositing, isFalse); + }); + testWidgets('works with transform', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/31986. final Key key = UniqueKey();