Unverified Commit a35d6615 authored by Justin McCandless's avatar Justin McCandless Committed by GitHub

Double double tap toggles instead of error (#33802)

Fix exception that was happening when double-double-tapping a TextField (or double long tapping).
parent c482edac
......@@ -744,8 +744,9 @@ class _TextFieldState extends State<TextField> with AutomaticKeepAliveClientMixi
from: details.globalPosition,
cause: SelectionChangedCause.forcePress,
);
if (_shouldShowSelectionToolbar)
_editableTextKey.currentState.showToolbar();
if (_shouldShowSelectionToolbar) {
_editableTextKey.currentState.toggleToolbar();
}
}
}
......@@ -812,15 +813,18 @@ class _TextFieldState extends State<TextField> with AutomaticKeepAliveClientMixi
}
void _handleSingleLongTapEnd(LongPressEndDetails details) {
if (_shouldShowSelectionToolbar)
_editableTextKey.currentState.showToolbar();
if (widget.selectionEnabled) {
if (_shouldShowSelectionToolbar)
_editableTextKey.currentState.toggleToolbar();
}
}
void _handleDoubleTapDown(TapDownDetails details) {
if (widget.selectionEnabled) {
_renderEditable.selectWord(cause: SelectionChangedCause.doubleTap);
if (_shouldShowSelectionToolbar)
_editableTextKey.currentState.showToolbar();
if (_shouldShowSelectionToolbar) {
_editableText.toggleToolbar();
}
}
}
......
......@@ -5220,6 +5220,70 @@ void main() {
},
);
testWidgets(
'double double tap toggles selection menu',
(WidgetTester tester) async {
final TextEditingController controller = TextEditingController(
text: '',
);
await tester.pumpWidget(
MaterialApp(
home: Material(
child: Center(
child: TextField(
controller: controller,
),
),
),
),
);
// Double tap on the same location shows the selection menu.
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pump(const Duration(milliseconds: 50));
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pump();
expect(find.text('PASTE'), findsOneWidget);
// Double tap again hides the selection menu.
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pump(const Duration(milliseconds: 50));
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pump();
expect(find.text('PASTE'), findsNWidgets(0));
},
);
testWidgets(
'double long press toggles selection menu',
(WidgetTester tester) async {
final TextEditingController controller = TextEditingController(
text: '',
);
await tester.pumpWidget(
MaterialApp(
home: Material(
child: Center(
child: TextField(
controller: controller,
),
),
),
),
);
// Long press shows the selection menu.
await tester.longPressAt(textOffsetToPosition(tester, 0));
await tester.pump();
expect(find.text('PASTE'), findsOneWidget);
// Double tap again hides the selection menu.
await tester.longPressAt(textOffsetToPosition(tester, 0));
await tester.pump();
expect(find.text('PASTE'), findsNWidgets(0));
},
);
testWidgets(
'double tap hold selects word (iOS)',
(WidgetTester tester) async {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment