32

In current implementation of SearchDelegate, there is no option to change the hint text. When the query is empty, search screen is displaying "Search" in the query field as a hint text.

Hint text is currently defined on line 395 as follows:

final String searchFieldLabel = MaterialLocalizations.of(context).searchFieldLabel;

There is, however, an existing issue to this subject reported.

I wasn't able to come up with any solution for this. Do you know any workaround for the issue?

Despotovic
  • 1,807
  • 2
  • 20
  • 24

7 Answers7

79

Currently SearchDelegate has an optional member "searchFieldLabel" to specify the label of the search field. It should look something like this:

  @override
  String get searchFieldLabel => 'custom label';
Manassé
  • 991
  • 1
  • 7
  • 6
  • 7
    This should be checked as the right answer. The first one is a workaround that doesn't work when you have two or more searches in your app. – siega Sep 27 '19 at 21:28
  • 1
    Some tip to change hint text style? – ricardogobbo Apr 13 '20 at 05:03
  • @riccardogobbo I opened a PR (https://github.com/flutter/flutter/pull/54674) because Flutter is currently missing a proper way to set it using the constructor. It is currently only possible using this workaround: https://stackoverflow.com/questions/61194153/flutter-set-search-hint-style-of-searchdelegate – Leonardo Emili Apr 14 '20 at 16:26
  • Simple and easy solution! – Ørjan Dec 16 '20 at 09:00
18
class SongSearch extends SearchDelegate<String> {
  SongSearch({
    String hintText = "Song Search",
  }) : super(
          searchFieldLabel: hintText,
          keyboardType: TextInputType.text,
          textInputAction: TextInputAction.search,
        );
.....
iDecode
  • 22,623
  • 19
  • 99
  • 186
15

There is a workaround for this by creating your own DefaultMaterialLocalizations class and passing it into the MaterialApp widget:

void main() => runApp(SearchApp());

class SearchApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        CustomLocalizationDelegate(),
      ],
      home: Scaffold(
        appBar: AppBar(
          title: Text('Search demo'),
        ),
        body: Center(
          child: Builder(
            builder: (context) => MaterialButton(
              child: Text('Search'),
              onPressed: () => showSearch(
                context: context,
                delegate: DummyDelegate(),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class DummyDelegate extends SearchDelegate<String> {
  @override
  List<Widget> buildActions(BuildContext context) => [];

  @override
  Widget buildLeading(BuildContext context) => IconButton(
    icon: Icon(Icons.close),
    onPressed: () => Navigator.of(context).pop(),
  );

  @override
  Widget buildResults(BuildContext context) => Text('Result');

  @override
  Widget buildSuggestions(BuildContext context) => Text('Suggestion');
}

class CustomLocalizationDelegate extends LocalizationsDelegate<MaterialLocalizations> {
  const CustomLocalizationDelegate();

  @override
  bool isSupported(Locale locale) => locale.languageCode == 'en';

  @override
  Future<MaterialLocalizations> load(Locale locale) => SynchronousFuture<MaterialLocalizations>(const CustomLocalization());

  @override
  bool shouldReload(CustomLocalizationDelegate old) => false;

  @override
  String toString() => 'CustomLocalization.delegate(en_US)';
}

class CustomLocalization extends DefaultMaterialLocalizations {
  const CustomLocalization();

  @override
  String get searchFieldLabel => "My hint text";
}
Jordan Davies
  • 9,925
  • 6
  • 40
  • 51
  • Awesome. Can you also suggest how we can change the Hint Text color and Cursor Color for the search bar since it does not take the value defined in the main app ThemeData. – illuminate May 23 '19 at 14:36
  • Yeah, ThemeData has a `hintColor` property. – Jordan Davies May 23 '19 at 14:53
  • yes, there does not seem to be a way to override cursor color. is there? ive successfully overriden colors to match the theme's app bar but the cursor does not get changed. – chitgoks Jan 02 '20 at 12:42
4

As far as the hint color is concerned, if you're still looking for a solution, HintColor won't work. Use the InputDecoration property of ThemeData like so:

inputDecorationTheme: InputDecorationTheme(hintStyle: Theme.of(context).textTheme.title.copyWith(color: Colors.white),)
CP17
  • 481
  • 4
  • 6
2

With null-safety, you should do something like:

class MyDelegate extends SearchDelegate<String> {
  final String? hintText;
  MyDelegate({this.hintText});
  
  @override
  String? get searchFieldLabel => hintText;
  
  // Other overrides...
}

Usage:

showSearch<String>(
  context: context,
  delegate: MyDelegate(hintText: 'My hint'),
);
CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
2

Use the "searchFieldLabel" properties to customize the placeholder for the search box and can also modify the SearchDelegate properties listed below:

SearchDelegate({
    this.searchFieldLabel,
    this.searchFieldStyle,
    this.searchFieldDecorationTheme,
    this.keyboardType,
    this.textInputAction = TextInputAction.search,
  })........ 

To illustrate:

class SearchScreen extends SearchDelegate {
 
  SearchScreen({
    String hintText = "অনুসন্ধান",
  }) : super(
          searchFieldLabel: hintText,
          keyboardType: TextInputType.text,
          textInputAction: TextInputAction.search,
          searchFieldStyle: TextStyle(
              color: Color.fromARGB(178, 255, 255, 255),
              fontWeight: FontWeight.bold),
        );
.
.
}
1

You can just extend the source class and override its default field in your constructor to define your own value for the field?

For example:

class CustomSearch extends SearchDelegate<String> {
    CustomSearch() : super(searchFieldLabel: "My own hint");
}
eyoeldefare
  • 2,136
  • 1
  • 15
  • 25