Flutter - Изменить текст подсказки поиска SearchDelegate - PullRequest
0 голосов
/ 04 февраля 2019

В текущей реализации SearchDelegate нет возможности изменить текст подсказки.Когда запрос пуст, на экране поиска отображается «Поиск» в поле запроса в виде текста подсказки.

Текст подсказки в настоящее время определяется в строке 395 следующим образом:

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

Однако существует существующая проблема по этому вопросу, о которой сообщается .

Я не смог придумать никакого решения для этого.Знаете ли вы какие-либо обходные пути для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 03 августа 2019

В настоящее время в основной ветке флаттера SearchDelegate имеет необязательный элемент "searchFieldLabel", чтобы указать метку поля поиска.

0 голосов
/ 04 февраля 2019

Для этого есть обходной путь, создав собственный класс DefaultMaterialLocalizations и передав его в виджет MaterialApp:

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";
}
...