Search code examples
listfluttersearchbar

Search bar with ListView possible in Flutter?


I want to implement a searchbar in my flutter application. I have to go through a listview out of ListTiles. Here I want to check if the title of the listtile contains the letters in the search field. Is this possible with a List? It does not have to be with the title. It could be something else with what I can identify the Tile. But please, not the index, the user would not know it. Is a List the right widget or do I have to use something else to implement a search Engine in my Application


Solution

  • Rather than using a 3rd party package, you can use native showSearch() function :

    showSearch(context: context, delegate: ListSearchDelegate());
    

    And then a class extending SearchDelegate:

    class ListSearchDelegate extends SearchDelegate{
    
      ListSearchDelegate({Key key,}): super() ;
    
      List<String> listItems = <String>['One', 'Two', 'Three', 'Four', 'Five'] ;
    
      @override
      List<Widget> buildActions(BuildContext context) {
    
        return [
          IconButton(
            icon: Icon(Icons.clear),
            onPressed: () {
              query = '';
            },
          ),
        ];
      }
    
      @override
      Widget buildLeading(BuildContext context) {
        return IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            close(context, null);
          },
        );
      }
    
      @override
      Widget buildResults(BuildContext context) {
    
        List<String> subList ;
    
        subList = query != '' ? listItems.where((item) => item.contains(query)).toList() : 
          listItems ;
    
        return ListView.builder(
            itemCount: subList.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(subList[index]),
              );
            }
        );
      }
    
      @override
      Widget buildSuggestions(BuildContext context) {
        return Container();
      }
    
    }