Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
473 of 1024 menu
◀ ▶

Класс 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.

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить