Skip to content

Commit

Permalink
Fix Tooltip Issue on Switch (#110830)
Browse files Browse the repository at this point in the history
  • Loading branch information
QuncCccccc committed Sep 2, 2022
1 parent 57e42f0 commit 4b91b22
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 4 deletions.
8 changes: 4 additions & 4 deletions packages/flutter/lib/src/material/toggleable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -320,10 +320,10 @@ mixin ToggleableStateMixin<S extends StatefulWidget> on TickerProviderStateMixin
mouseCursor: mouseCursor.resolve(states),
child: GestureDetector(
excludeFromSemantics: !isInteractive,
onTapDown: _handleTapDown,
onTap: _handleTap,
onTapUp: _handleTapEnd,
onTapCancel: _handleTapEnd,
onTapDown: isInteractive ? _handleTapDown : null,
onTap: isInteractive ? _handleTap : null,
onTapUp: isInteractive ? _handleTapEnd : null,
onTapCancel: isInteractive ? _handleTapEnd : null,
child: Semantics(
enabled: isInteractive,
child: CustomPaint(
Expand Down
52 changes: 52 additions & 0 deletions packages/flutter/test/material/checkbox_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter/src/gestures/constants.dart';
import 'package:flutter_test/flutter_test.dart';

import '../rendering/mock_canvas.dart';
Expand Down Expand Up @@ -1446,6 +1447,57 @@ void main() {
await tester.pumpAndSettle();
expectBorder();
});

testWidgets('disabled checkbox shows tooltip', (WidgetTester tester) async {
const String longPressTooltip = 'long press tooltip';
const String tapTooltip = 'tap tooltip';
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
message: longPressTooltip,
child: Checkbox(value: true, onChanged: null),
),
),
)
);

// Default tooltip shows up after long pressed.
final Finder tooltip0 = find.byType(Tooltip);
expect(find.text(longPressTooltip), findsNothing);

await tester.tap(tooltip0);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(longPressTooltip), findsNothing);

final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
await tester.pump();
await tester.pump(kLongPressTimeout);
await gestureLongPress.up();
await tester.pump();

expect(find.text(longPressTooltip), findsOneWidget);

// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: tapTooltip,
child: Checkbox(value: true, onChanged: null),
),
),
)
);

final Finder tooltip1 = find.byType(Tooltip);
expect(find.text(tapTooltip), findsNothing);

await tester.tap(tooltip1);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(tapTooltip), findsOneWidget);
});
}

class _SelectedGrabMouseCursor extends MaterialStateMouseCursor {
Expand Down
52 changes: 52 additions & 0 deletions packages/flutter/test/material/radio_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter/src/gestures/constants.dart';
import 'package:flutter_test/flutter_test.dart';

import '../rendering/mock_canvas.dart';
Expand Down Expand Up @@ -1115,4 +1116,55 @@ void main() {
// Release pointer after widget disappeared.
await gesture.up();
});

testWidgets('disabled radio shows tooltip', (WidgetTester tester) async {
const String longPressTooltip = 'long press tooltip';
const String tapTooltip = 'tap tooltip';
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
message: longPressTooltip,
child: Radio<bool>(value: true, groupValue: false, onChanged: null),
),
),
)
);

// Default tooltip shows up after long pressed.
final Finder tooltip0 = find.byType(Tooltip);
expect(find.text(longPressTooltip), findsNothing);

await tester.tap(tooltip0);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(longPressTooltip), findsNothing);

final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
await tester.pump();
await tester.pump(kLongPressTimeout);
await gestureLongPress.up();
await tester.pump();

expect(find.text(longPressTooltip), findsOneWidget);

// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: tapTooltip,
child: Radio<bool>(value: true, groupValue: false, onChanged: null),
),
),
)
);

final Finder tooltip1 = find.byType(Tooltip);
expect(find.text(tapTooltip), findsNothing);

await tester.tap(tooltip1);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(tapTooltip), findsOneWidget);
});
}
57 changes: 57 additions & 0 deletions packages/flutter/test/material/switch_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1721,6 +1721,63 @@ void main() {
await gesture.up();
});

testWidgets('disabled switch shows tooltip', (WidgetTester tester) async {
const String longPressTooltip = 'long press tooltip';
const String tapTooltip = 'tap tooltip';
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
message: longPressTooltip,
child: Switch(
onChanged: null,
value: true,
),
),
),
)
);

// Default tooltip shows up after long pressed.
final Finder tooltip0 = find.byType(Tooltip);
expect(find.text(longPressTooltip), findsNothing);

await tester.tap(tooltip0);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(longPressTooltip), findsNothing);

final TestGesture gestureLongPress = await tester.startGesture(tester.getCenter(tooltip0));
await tester.pump();
await tester.pump(kLongPressTimeout);
await gestureLongPress.up();
await tester.pump();

expect(find.text(longPressTooltip), findsOneWidget);

// Tooltip shows up after tapping when set triggerMode to TooltipTriggerMode.tap.
await tester.pumpWidget(
const MaterialApp(
home: Material(
child: Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: tapTooltip,
child: Switch(
onChanged: null,
value: true,
),
),
),
)
);

final Finder tooltip1 = find.byType(Tooltip);
expect(find.text(tapTooltip), findsNothing);

await tester.tap(tooltip1);
await tester.pump(const Duration(milliseconds: 10));
expect(find.text(tapTooltip), findsOneWidget);
});

group('with image', () {
late ui.Image image;

Expand Down

0 comments on commit 4b91b22

Please sign in to comment.