Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4b11d8

Browse files
authored
Make it possible to disable tapping to dismiss a tooltip. (#137375)
issue: flutter/flutter#137438 Use case: I want to add action button is tooltip and thus want to disable tap to dismiss a tooltip. ![image](https://github.com/flutter/flutter/assets/108393416/39c606fd-d301-4ed4-a411-4916823e5757)
1 parent e65c268 commit c4b11d8

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

packages/flutter/lib/src/material/tooltip.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class Tooltip extends StatefulWidget {
185185
this.textAlign,
186186
this.waitDuration,
187187
this.showDuration,
188+
this.enableTapToDismiss = true,
188189
this.triggerMode,
189190
this.enableFeedback,
190191
this.onTriggered,
@@ -307,6 +308,11 @@ class Tooltip extends StatefulWidget {
307308
/// for mouse pointer exits the widget.
308309
final Duration? showDuration;
309310

311+
/// Whether the tooltip can be dismissed by tap.
312+
///
313+
/// The default value is true.
314+
final bool enableTapToDismiss;
315+
310316
/// The [TooltipTriggerMode] that will show the tooltip.
311317
///
312318
/// If this property is null, then [TooltipThemeData.triggerMode] is used.
@@ -581,6 +587,9 @@ class TooltipState extends State<Tooltip> with SingleTickerProviderStateMixin {
581587
// The primary pointer is not part of a "trigger" gesture so the tooltip
582588
// should be dismissed.
583589
void _handleTapToDismiss() {
590+
if (!widget.enableTapToDismiss) {
591+
return ;
592+
}
584593
_scheduleDismissTooltip(withDelay: Duration.zero);
585594
_activeHoveringPointerDevices.clear();
586595
}

packages/flutter/test/material/tooltip_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,39 @@ void main() {
10161016
expect(find.text(tooltipText), findsNothing);
10171017
});
10181018

1019+
testWidgetsWithLeakTracking('Tooltip is dismissed after tap to dismiss immediately', (WidgetTester tester) async {
1020+
1021+
await setWidgetForTooltipMode(tester, TooltipTriggerMode.tap);
1022+
1023+
final Finder tooltip = find.byType(Tooltip);
1024+
expect(find.text(tooltipText), findsNothing);
1025+
1026+
// Tap to trigger the tooltip.
1027+
await _testGestureTap(tester, tooltip);
1028+
expect(find.text(tooltipText), findsOneWidget);
1029+
1030+
// Tap to dismiss the tooltip. Tooltip is dismissed immediately.
1031+
await _testGestureTap(tester, find.text(tooltipText));
1032+
await tester.pump(const Duration(milliseconds: 10));
1033+
expect(find.text(tooltipText), findsNothing);
1034+
});
1035+
1036+
testWidgetsWithLeakTracking('Tooltip is not dismissed after tap if enableTapToDismiss is false', (WidgetTester tester) async {
1037+
await setWidgetForTooltipMode(tester, TooltipTriggerMode.tap, enableTapToDismiss: false);
1038+
1039+
final Finder tooltip = find.byType(Tooltip);
1040+
expect(find.text(tooltipText), findsNothing);
1041+
1042+
// Tap to trigger the tooltip.
1043+
await _testGestureTap(tester, tooltip);
1044+
expect(find.text(tooltipText), findsOneWidget);
1045+
1046+
// Tap the tooltip. Tooltip is not dismissed .
1047+
await _testGestureTap(tester, find.text(tooltipText));
1048+
await tester.pump(const Duration(milliseconds: 10));
1049+
expect(find.text(tooltipText), findsOneWidget);
1050+
});
1051+
10191052
testWidgetsWithLeakTracking('Tooltip is dismissed after a tap and showDuration expired when competing with a GestureDetector', (WidgetTester tester) async {
10201053
// Regression test for https://github.com/flutter/flutter/issues/98854
10211054
const Duration showDuration = Duration(seconds: 3);
@@ -2480,6 +2513,7 @@ Future<void> setWidgetForTooltipMode(
24802513
WidgetTester tester,
24812514
TooltipTriggerMode triggerMode, {
24822515
Duration? showDuration,
2516+
bool? enableTapToDismiss,
24832517
TooltipTriggeredCallback? onTriggered,
24842518
}) async {
24852519
await tester.pumpWidget(
@@ -2489,6 +2523,7 @@ Future<void> setWidgetForTooltipMode(
24892523
triggerMode: triggerMode,
24902524
onTriggered: onTriggered,
24912525
showDuration: showDuration,
2526+
enableTapToDismiss: enableTapToDismiss ?? true,
24922527
child: const SizedBox(width: 100.0, height: 100.0),
24932528
),
24942529
),

0 commit comments

Comments
 (0)