Skip to content

Commit 4b91b22

Browse files
authored
Fix Tooltip Issue on Switch (#110830)
1 parent 57e42f0 commit 4b91b22

File tree

4 files changed

+165
-4
lines changed

4 files changed

+165
-4
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,10 @@ mixin ToggleableStateMixin<S extends StatefulWidget> on TickerProviderStateMixin
320320
mouseCursor: mouseCursor.resolve(states),
321321
child: GestureDetector(
322322
excludeFromSemantics: !isInteractive,
323-
onTapDown: _handleTapDown,
324-
onTap: _handleTap,
325-
onTapUp: _handleTapEnd,
326-
onTapCancel: _handleTapEnd,
323+
onTapDown: isInteractive ? _handleTapDown : null,
324+
onTap: isInteractive ? _handleTap : null,
325+
onTapUp: isInteractive ? _handleTapEnd : null,
326+
onTapCancel: isInteractive ? _handleTapEnd : null,
327327
child: Semantics(
328328
enabled: isInteractive,
329329
child: CustomPaint(

packages/flutter/test/material/checkbox_test.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart';
88
import 'package:flutter/material.dart';
99
import 'package:flutter/rendering.dart';
1010
import 'package:flutter/services.dart';
11+
import 'package:flutter/src/gestures/constants.dart';
1112
import 'package:flutter_test/flutter_test.dart';
1213

1314
import '../rendering/mock_canvas.dart';
@@ -1446,6 +1447,57 @@ void main() {
14461447
await tester.pumpAndSettle();
14471448
expectBorder();
14481449
});
1450+
1451+
testWidgets('disabled checkbox shows tooltip', (WidgetTester tester) async {
1452+
const String longPressTooltip = 'long press tooltip';
1453+
const String tapTooltip = 'tap tooltip';
1454+
await tester.pumpWidget(
1455+
const MaterialApp(
1456+
home: Material(
1457+
child: Tooltip(
1458+
message: longPressTooltip,
1459+
child: Checkbox(value: true, onChanged: null),
1460+
),
1461+
),
1462+
)
1463+
);
1464+
1465+
// Default tooltip shows up after long pressed.
1466+
final Finder tooltip0 = find.byType(Tooltip);
1467+
expect(find.text(longPressTooltip), findsNothing);
1468+
1469+
await tester.tap(tooltip0);
1470+
await tester.pump(const Duration(milliseconds: 10));
1471+
expect(find.text(longPressTooltip), findsNothing);
1472+
1473+
final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
1474+
await tester.pump();
1475+
await tester.pump(kLongPressTimeout);
1476+
await gestureLongPress.up();
1477+
await tester.pump();
1478+
1479+
expect(find.text(longPressTooltip), findsOneWidget);
1480+
1481+
// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
1482+
await tester.pumpWidget(
1483+
const MaterialApp(
1484+
home: Material(
1485+
child: Tooltip(
1486+
triggerMode: TooltipTriggerMode.tap,
1487+
message: tapTooltip,
1488+
child: Checkbox(value: true, onChanged: null),
1489+
),
1490+
),
1491+
)
1492+
);
1493+
1494+
final Finder tooltip1 = find.byType(Tooltip);
1495+
expect(find.text(tapTooltip), findsNothing);
1496+
1497+
await tester.tap(tooltip1);
1498+
await tester.pump(const Duration(milliseconds: 10));
1499+
expect(find.text(tapTooltip), findsOneWidget);
1500+
});
14491501
}
14501502

14511503
class _SelectedGrabMouseCursor extends MaterialStateMouseCursor {

packages/flutter/test/material/radio_test.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:flutter/foundation.dart';
1212
import 'package:flutter/material.dart';
1313
import 'package:flutter/rendering.dart';
1414
import 'package:flutter/services.dart';
15+
import 'package:flutter/src/gestures/constants.dart';
1516
import 'package:flutter_test/flutter_test.dart';
1617

1718
import '../rendering/mock_canvas.dart';
@@ -1115,4 +1116,55 @@ void main() {
11151116
// Release pointer after widget disappeared.
11161117
await gesture.up();
11171118
});
1119+
1120+
testWidgets('disabled radio shows tooltip', (WidgetTester tester) async {
1121+
const String longPressTooltip = 'long press tooltip';
1122+
const String tapTooltip = 'tap tooltip';
1123+
await tester.pumpWidget(
1124+
const MaterialApp(
1125+
home: Material(
1126+
child: Tooltip(
1127+
message: longPressTooltip,
1128+
child: Radio<bool>(value: true, groupValue: false, onChanged: null),
1129+
),
1130+
),
1131+
)
1132+
);
1133+
1134+
// Default tooltip shows up after long pressed.
1135+
final Finder tooltip0 = find.byType(Tooltip);
1136+
expect(find.text(longPressTooltip), findsNothing);
1137+
1138+
await tester.tap(tooltip0);
1139+
await tester.pump(const Duration(milliseconds: 10));
1140+
expect(find.text(longPressTooltip), findsNothing);
1141+
1142+
final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
1143+
await tester.pump();
1144+
await tester.pump(kLongPressTimeout);
1145+
await gestureLongPress.up();
1146+
await tester.pump();
1147+
1148+
expect(find.text(longPressTooltip), findsOneWidget);
1149+
1150+
// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
1151+
await tester.pumpWidget(
1152+
const MaterialApp(
1153+
home: Material(
1154+
child: Tooltip(
1155+
triggerMode: TooltipTriggerMode.tap,
1156+
message: tapTooltip,
1157+
child: Radio<bool>(value: true, groupValue: false, onChanged: null),
1158+
),
1159+
),
1160+
)
1161+
);
1162+
1163+
final Finder tooltip1 = find.byType(Tooltip);
1164+
expect(find.text(tapTooltip), findsNothing);
1165+
1166+
await tester.tap(tooltip1);
1167+
await tester.pump(const Duration(milliseconds: 10));
1168+
expect(find.text(tapTooltip), findsOneWidget);
1169+
});
11181170
}

packages/flutter/test/material/switch_test.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,63 @@ void main() {
17211721
await gesture.up();
17221722
});
17231723

1724+
testWidgets('disabled switch shows tooltip', (WidgetTester tester) async {
1725+
const String longPressTooltip = 'long press tooltip';
1726+
const String tapTooltip = 'tap tooltip';
1727+
await tester.pumpWidget(
1728+
const MaterialApp(
1729+
home: Material(
1730+
child: Tooltip(
1731+
message: longPressTooltip,
1732+
child: Switch(
1733+
onChanged: null,
1734+
value: true,
1735+
),
1736+
),
1737+
),
1738+
)
1739+
);
1740+
1741+
// Default tooltip shows up after long pressed.
1742+
final Finder tooltip0 = find.byType(Tooltip);
1743+
expect(find.text(longPressTooltip), findsNothing);
1744+
1745+
await tester.tap(tooltip0);
1746+
await tester.pump(const Duration(milliseconds: 10));
1747+
expect(find.text(longPressTooltip), findsNothing);
1748+
1749+
final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
1750+
await tester.pump();
1751+
await tester.pump(kLongPressTimeout);
1752+
await gestureLongPress.up();
1753+
await tester.pump();
1754+
1755+
expect(find.text(longPressTooltip), findsOneWidget);
1756+
1757+
// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
1758+
await tester.pumpWidget(
1759+
const MaterialApp(
1760+
home: Material(
1761+
child: Tooltip(
1762+
triggerMode: TooltipTriggerMode.tap,
1763+
message: tapTooltip,
1764+
child: Switch(
1765+
onChanged: null,
1766+
value: true,
1767+
),
1768+
),
1769+
),
1770+
)
1771+
);
1772+
1773+
final Finder tooltip1 = find.byType(Tooltip);
1774+
expect(find.text(tapTooltip), findsNothing);
1775+
1776+
await tester.tap(tooltip1);
1777+
await tester.pump(const Duration(milliseconds: 10));
1778+
expect(find.text(tapTooltip), findsOneWidget);
1779+
});
1780+
17241781
group('with image', () {
17251782
late ui.Image image;
17261783

0 commit comments

Comments
 (0)