From ee274fde1da3b223e668489c8720977bc985ae67 Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Wed, 1 Jun 2022 00:48:10 +0300 Subject: [PATCH] Fix `showSearch` query text field doesn't show toolbar initially when field is empty. (#105023) --- packages/flutter/lib/src/material/search.dart | 4 ++- .../flutter/test/material/search_test.dart | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/material/search.dart b/packages/flutter/lib/src/material/search.dart index 5c2ec59dcd1..04b730d0677 100644 --- a/packages/flutter/lib/src/material/search.dart +++ b/packages/flutter/lib/src/material/search.dart @@ -263,7 +263,9 @@ abstract class SearchDelegate { set query(String value) { assert(query != null); _queryTextController.text = value; - _queryTextController.selection = TextSelection.fromPosition(TextPosition(offset: _queryTextController.text.length)); + if (_queryTextController.text.isNotEmpty) { + _queryTextController.selection = TextSelection.fromPosition(TextPosition(offset: _queryTextController.text.length)); + } } /// Transition from the suggestions returned by [buildSuggestions] to the diff --git a/packages/flutter/test/material/search_test.dart b/packages/flutter/test/material/search_test.dart index 8b3aa091ca4..629e3e66036 100644 --- a/packages/flutter/test/material/search_test.dart +++ b/packages/flutter/test/material/search_test.dart @@ -883,6 +883,42 @@ void main() { expect(rootObserver.pushCount, 1); expect(localObserver.pushCount, 1); }); + + testWidgets('Query text field shows toolbar initially', (WidgetTester tester) async { + // This is a regression test for https://github.com/flutter/flutter/issues/95588 + + final _TestSearchDelegate delegate = _TestSearchDelegate(); + final List selectedResults = []; + + await tester.pumpWidget(TestHomePage( + delegate: delegate, + results: selectedResults, + )); + + // Open search. + await tester.tap(find.byTooltip('Search')); + await tester.pumpAndSettle(); + + final Finder textFieldFinder = find.byType(TextField); + final TextField textField = tester.widget(textFieldFinder); + expect(textField.controller!.text.length, 0); + + mockClipboard.handleMethodCall(const MethodCall( + 'Clipboard.setData', + { + 'text': 'pasteablestring', + }, + )); + + // Long press shows toolbar. + await tester.longPress(textFieldFinder); + await tester.pump(); + expect(find.text('Paste'), findsOneWidget); + + await tester.tap(find.text('Paste')); + await tester.pump(); + expect(textField.controller!.text.length, 15); + }, skip: kIsWeb); // [intended] We do not use Flutter-rendered context menu on the Web. } class TestHomePage extends StatelessWidget {