@@ -930,6 +930,72 @@ void main() {
930930 await gesture.up ();
931931 });
932932
933+ testWidgets ('Tooltip is dismissed after a long press and showDuration expired' , (WidgetTester tester) async {
934+ const Duration showDuration = Duration (seconds: 3 );
935+ await setWidgetForTooltipMode (tester, TooltipTriggerMode .longPress, showDuration: showDuration);
936+
937+ final Finder tooltip = find.byType (Tooltip );
938+ final TestGesture gesture = await tester.startGesture (tester.getCenter (tooltip));
939+
940+ // Long press reveals tooltip
941+ await tester.pump (kLongPressTimeout);
942+ await tester.pump (const Duration (milliseconds: 10 ));
943+ expect (find.text (tooltipText), findsOneWidget);
944+ await gesture.up ();
945+
946+ // Tooltip is dismissed after showDuration expired
947+ await tester.pump (showDuration);
948+ await tester.pump (const Duration (milliseconds: 10 ));
949+ expect (find.text (tooltipText), findsNothing);
950+ });
951+
952+ testWidgets ('Tooltip is dismissed after a tap and showDuration expired' , (WidgetTester tester) async {
953+ const Duration showDuration = Duration (seconds: 3 );
954+ await setWidgetForTooltipMode (tester, TooltipTriggerMode .tap, showDuration: showDuration);
955+
956+ final Finder tooltip = find.byType (Tooltip );
957+ expect (find.text (tooltipText), findsNothing);
958+
959+ await testGestureTap (tester, tooltip);
960+ expect (find.text (tooltipText), findsOneWidget);
961+
962+ // Tooltip is dismissed after showDuration expired
963+ await tester.pump (showDuration);
964+ await tester.pump (const Duration (milliseconds: 10 ));
965+ expect (find.text (tooltipText), findsNothing);
966+ });
967+
968+ testWidgets ('Tooltip is dismissed after a tap and showDuration expired when competing with a GestureDetector' , (WidgetTester tester) async {
969+ // Regression test for https://github.com/flutter/flutter/issues/98854
970+ const Duration showDuration = Duration (seconds: 3 );
971+ await tester.pumpWidget (
972+ MaterialApp (
973+ home: GestureDetector (
974+ onVerticalDragStart: (_) { /* Do nothing */ },
975+ child: const Tooltip (
976+ message: tooltipText,
977+ triggerMode: TooltipTriggerMode .tap,
978+ showDuration: showDuration,
979+ child: SizedBox (width: 100.0 , height: 100.0 ),
980+ ),
981+ ),
982+ ),
983+ );
984+ final Finder tooltip = find.byType (Tooltip );
985+ expect (find.text (tooltipText), findsNothing);
986+
987+ await tester.tap (tooltip);
988+ // Wait for GestureArena disambiguation, delay is kPressTimeout to disambiguate
989+ // between onTap and onVerticalDragStart
990+ await tester.pump (kPressTimeout);
991+ expect (find.text (tooltipText), findsOneWidget);
992+
993+ // Tooltip is dismissed after showDuration expired
994+ await tester.pump (showDuration);
995+ await tester.pump (const Duration (milliseconds: 10 ));
996+ expect (find.text (tooltipText), findsNothing);
997+ });
998+
933999 testWidgets ('Dispatch the mouse events before tip overlay detached' , (WidgetTester tester) async {
9341000 // Regression test for https://github.com/flutter/flutter/issues/96890
9351001 const Duration waitDuration = Duration .zero;
@@ -1840,13 +1906,19 @@ void main() {
18401906 });
18411907}
18421908
1843- Future <void > setWidgetForTooltipMode (WidgetTester tester, TooltipTriggerMode triggerMode, {TooltipTriggeredCallback ? onTriggered}) async {
1909+ Future <void > setWidgetForTooltipMode (
1910+ WidgetTester tester,
1911+ TooltipTriggerMode triggerMode, {
1912+ Duration ? showDuration,
1913+ TooltipTriggeredCallback ? onTriggered,
1914+ }) async {
18441915 await tester.pumpWidget (
18451916 MaterialApp (
18461917 home: Tooltip (
18471918 message: tooltipText,
18481919 triggerMode: triggerMode,
18491920 onTriggered: onTriggered,
1921+ showDuration: showDuration,
18501922 child: const SizedBox (width: 100.0 , height: 100.0 ),
18511923 ),
18521924 ),
0 commit comments