From e02462a44fb6422d00dea147e90e7397bab4e254 Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Fri, 3 Jun 2022 09:03:09 +0300 Subject: [PATCH] `CheckedPopupMenuItem`: Fix cursor bug and add cursor parameter (#103474) --- .../flutter/lib/src/material/popup_menu.dart | 15 ++-- .../test/material/popup_menu_test.dart | 81 ++++++++++++++++++- 2 files changed, 89 insertions(+), 7 deletions(-) diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index 01a4644392..8d295e0327 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -461,6 +461,7 @@ class CheckedPopupMenuItem extends PopupMenuItem { super.enabled, super.padding, super.height, + super.mouseCursor, super.child, }) : assert(checked != null); @@ -514,13 +515,15 @@ class _CheckedPopupMenuItemState extends PopupMenuItemState(child: Text('item')).runtimeType; @@ -2092,6 +2091,86 @@ void main() { expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic); }); + testWidgets('CheckedPopupMenuItem changes mouse cursor when hovered', (WidgetTester tester) async { + const Key key = ValueKey(1); + // Test CheckedPopupMenuItem() constructor + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: Material( + child: MouseRegion( + cursor: SystemMouseCursors.forbidden, + child: CheckedPopupMenuItem( + key: key, + mouseCursor: SystemMouseCursors.text, + value: 1, + child: Container(), + ), + ), + ), + ), + ), + ), + ); + + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 1); + await gesture.addPointer(location: tester.getCenter(find.byKey(key))); + addTearDown(gesture.removePointer); + + await tester.pump(); + + expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.text); + + // Test default cursor + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: Material( + child: MouseRegion( + cursor: SystemMouseCursors.forbidden, + child: CheckedPopupMenuItem( + key: key, + value: 1, + child: Container(), + ), + ), + ), + ), + ), + ), + ); + + expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.click); + + // Test default cursor when disabled + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: Material( + child: MouseRegion( + cursor: SystemMouseCursors.forbidden, + child: CheckedPopupMenuItem( + key: key, + value: 1, + enabled: false, + child: Container(), + ), + ), + ), + ), + ), + ), + ); + + expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic); + }); + testWidgets('PopupMenu in AppBar does not overlap with the status bar', (WidgetTester tester) async { const List> choices = >[ PopupMenuItem(value: 1, child: Text('Item 1')),