diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index d4d1f645e8..6f6ea858f6 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -3150,6 +3150,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien ReplaceTextIntent: _replaceTextAction, UpdateSelectionIntent: _updateSelectionAction, DirectionalFocusIntent: DirectionalFocusAction.forTextField(), + DismissIntent: CallbackAction(onInvoke: (_) => hideToolbar(false)), // Delete DeleteCharacterIntent: _makeOverridable(_DeleteTextAction(this, _characterBoundary)), diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 8ba96c63fe..7f5462db03 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -1316,6 +1316,41 @@ void main() { expect(find.text('Paste'), kIsWeb ? findsNothing : findsOneWidget); }); + testWidgets('can hide toolbar with DismissIntent', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: EditableText( + backgroundCursorColor: Colors.grey, + controller: controller, + focusNode: focusNode, + style: textStyle, + cursorColor: cursorColor, + selectionControls: materialTextSelectionControls, + ), + ), + ); + + final EditableTextState state = + tester.state(find.byType(EditableText)); + + // Show the toolbar + state.renderEditable.selectWordsInRange( + from: Offset.zero, + cause: SelectionChangedCause.tap, + ); + await tester.pump(); + + // On web, we don't let Flutter show the toolbar. + expect(state.showToolbar(), kIsWeb ? isFalse : isTrue); + await tester.pumpAndSettle(); + expect(find.text('Paste'), kIsWeb ? findsNothing : findsOneWidget); + + // Hide the menu using the DismissIntent. + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pump(); + expect(find.text('Paste'), findsNothing); + }); + testWidgets('Paste is shown only when there is something to paste', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp(