Класс SearchDelegate
Класс SearchDelegate задаёт панель и тело поискового маршрута.
Кнопки слева и справа -
buildLeading
и
buildActions,
подсказки -
buildSuggestions,
результаты -
buildResults.
Экземпляр передают в
showSearch.
Синтаксис
class SimpleSearchDelegate extends SearchDelegate<String?>
{
@override
Widget buildLeading(BuildContext context)
{
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => close(context, null),
);
}
@override
List<Widget> buildActions(BuildContext context)
{
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () => query = '',
),
];
}
@override
Widget buildResults(BuildContext context)
{
return Center(child: Text(query));
}
@override
Widget buildSuggestions(BuildContext context)
{
return ListTile(title: Text('abcde'));
}
}
Методы
| Метод | Описание |
|---|---|
buildLeading |
Виджет слева в AppBar поиска, обычно «назад».
|
buildActions |
Кнопки справа, например очистка query. |
buildSuggestions |
Рисует экран подсказок до submit. |
buildResults |
Строит экран результатов по текущему запросу. |
Пример
Давайте откроем showSearch с простым delegate:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: SearchDemo()));
}
class SearchDemo extends StatelessWidget
{
const SearchDemo({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
appBar: AppBar(title: Text('abcde')),
body: Center(
child: IconButton(
icon: Icon(Icons.search),
onPressed: () {
showSearch(
context: context,
delegate: _DemoDelegate(),
);
},
),
),
);
}
}
class _DemoDelegate extends SearchDelegate<void>
{
@override
Widget buildLeading(BuildContext context)
{
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => close(context, null),
);
}
@override
List<Widget> buildActions(BuildContext context) => [];
@override
Widget buildResults(BuildContext context)
{
return Center(child: Text('12345'));
}
@override
Widget buildSuggestions(BuildContext context)
{
return ListTile(title: Text('abcde'));
}
}
Иконка лупы откроет маршрут с подсказкой 'abcde'.
Пример
Давайте вернём строку из showSearch:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: SearchResultDemo()));
}
class SearchResultDemo extends StatelessWidget
{
const SearchResultDemo({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () async {
final picked = await showSearch<String>(
context: context,
delegate: _PickDelegate(),
);
if (context.mounted && picked != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(picked)),
);
}
},
child: Text('12345'),
),
),
);
}
}
class _PickDelegate extends SearchDelegate<String?>
{
@override
Widget buildLeading(BuildContext context)
{
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => close(context, null),
);
}
@override
List<Widget> buildActions(BuildContext context) => [];
@override
Widget buildResults(BuildContext context)
{
return ListTile(
title: Text('abcde'),
onTap: () => close(context, 'abcde'),
);
}
@override
Widget buildSuggestions(BuildContext context)
{
return buildResults(context);
}
}
Выбор строки закроет поиск и покажет SnackBar.
Смотрите также
-
функция
showSearch,
открывает delegate на маршруте -
виджет
SearchAnchor,
поискMaterial3 без delegate -
виджет
SearchBar,
поле вSearchAnchor -
метод
buildSuggestions,
экран подсказок