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();