HitsSearcher (
String applicationID,
String apiKey,
String indexName,
// Optional parameters
bool disjunctiveFacetingEnabled,
Duration debounce,
)
HitsSearcher . create (
String applicationID,
String apiKey,
SearchState state,
// Optional parameters
bool disjunctiveFacetingEnabled,
Duration debounce,
)
FacetSearcher (
String applicationID,
String apiKey,
String indexName,
String facet,
// Optional parameters
Duration debounce,
)
FacetSearcher . create (
String applicationID,
String apiKey,
FacetSearchState state,
// Optional parameters
Duration debounce,
)
MultiSearcher (
String applicationID,
String apiKey,
// Optional parameters
EventTracker eventTracker
)
The component handling a search request ,
HitsSearcher has the following behavior:
Distinct state changes (including initial state) will trigger a search operation
State changes are debounced
On a new search request, any previous ongoing search calls will be cancelled
Algolia for Flutter comes with these searchers:
HitsSearcher. Searches a single index .
FacetSearcher. Searches for facet values.
MultiSearcher. Aggregates the hits and facet searchers. This is useful for building a federated search, or query suggestions.
Examples
Create a HitsSearcher
Update search state with query and applyState
Listen to search responses and build the UI
dispose of underlying resources
class SearchScreen extends StatefulWidget {
const SearchScreen ({ super .key});
@override
State < SearchScreen > createState () => _SearchScreenState ();
}
class _SearchScreenState extends State < SearchScreen > {
// 1. Create a Hits Searcher
final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
);
@override
Widget build ( BuildContext context) => Scaffold (
appBar : AppBar (
// 2. Run your search operations
title : TextField (
onChanged : (input) => hitsSearcher. query (input),
decoration : const InputDecoration (
hintText : 'Search...' ,
prefixIcon : Icon ( Icons .search),
fillColor : Colors .white,
filled : true ,
),
),
),
// 3.1 Listen to search responses
body : StreamBuilder < SearchResponse >(
stream : hitsSearcher.responses,
builder : (_, snapshot) {
if (snapshot.hasData) {
final response = snapshot.data;
final hits = response ? .hits. toList () ?? [];
// 3.2 Display your search hits
return ListView . builder (
itemCount : hits.length,
itemBuilder : (_, i) => ListTile (title : Text (hits[i][ 'title' ])),
);
} else {
return const Center (child : CircularProgressIndicator ());
}
},
),
);
@override
void dispose () {
super . dispose ();
// 4. Release underling resources
hitsSearcher. dispose ();
}
}
HitsSearcher
The ID of your application. final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
);
Your application’s Search-only API key . final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
);
The index to search into. final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
);
Initial search state. final hitsSearcher = HitsSearcher . create (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
state : const SearchState (indexName : 'YourIndexName' ),
);
disjunctiveFacetingEnabled
Whether disjunctive faceting is enabled. final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
disjunctiveFacetingEnabled : true ,
);
Search operation debounce duration. final hitsSearcher = HitsSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
debounce : const Duration (milliseconds : 100 ),
);
Fields
Stream of search responses. StreamBuilder < SearchResponse >(
stream : hitsSearcher.responses,
builder : (context, snapshot) {
if (snapshot.hasData) {
final response = snapshot.data ! ;
return Column (
children : [
Text ( ' ${ response . nbHits } hits found' ),
ListView . builder (
itemCount : response.hits.length,
itemBuilder : (context, index) {
final hit = response.hits[index];
return ListTile (title : Text (hit[ 'name' ]));
},
),
],
);
} else {
return const CircularProgressIndicator ();
}
},
);
Stream of search states. StreamBuilder < SearchState >(
stream : searcher.state,
builder : (context, snapshot) {
if (snapshot.hasData) {
final query = snapshot.data ? .query ?? '' ;
return Text ( 'Query: $ query ' );
} else {
return const CircularProgressIndicator ();
}
},
);
Instance responsible for handling and sending user events related to search interactions,
such as clicks, conversions, and views.
These events help to personalize the user’s search experience by providing insights into user behavior.
eventTracker is automatically integrated with the HitsSearcher to track events when users interact with the search results. hitsSearcher.eventTracker. clickedObjects (
indexName : 'YourIndexName' ,
objectIDs : [ 'objectID1' , 'objectID2' ],
eventName : 'your_event_name' ,
);
Methods
Triggers a search operation with given search query . hitsSearcher. query ( 'book' );
Applies a search state configuration and triggers a search operation. hitsSearcher. applyState ((state) => state. copyWith (query : 'book' , page : 0 ));
Gets the latest SearchResponse value submitted by responses stream: final response = hitsSearcher. snapshot ();
Releases all underlying resources
FacetSearcher
The ID of your application. final facetSearcher = FacetSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
facet : 'facet_attribute' ,
);
Your application’s Search-only API key . final facetSearcher = FacetSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
facet : 'facet_attribute' ,
);
The index to search into. final facetSearcher = FacetSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
facet : 'facet_attribute' ,
);
The facet name to search into when doing search for facet values. final facetSearcher = FacetSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
facet : 'facet_attribute' ,
);
Initial facet search state. final facetSearcher = FacetSearcher . create (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
state : FacetSearchState (
searchState : SearchState (indexName : 'YourIndexName' ),
facet : 'facet_attribute' ,
),
);
Search operation debounce duration. final facetSearcher = FacetSearcher (
applicationID : 'YourApplicationID' ,
apiKey : 'YourSearchOnlyApiKey' ,
indexName : 'YourIndexName' ,
facet : 'facet_attribute' ,
debounce : const Duration (milliseconds : 100 ),
);
Fields
responses
Stream<FacetSearchResponse>
Stream of search responses. StreamBuilder < FacetSearchResponse >(
stream : facetSearcher.responses,
builder : ( BuildContext context,
AsyncSnapshot < FacetSearchResponse > snapshot) {
if (snapshot.hasData) {
final response = snapshot.data;
final facets = response ? .facetHits. toList () ?? [];
return ListView . builder (
itemCount : facets.length,
itemBuilder : ( BuildContext context, int index) {
final facet = facets[index];
return ListTile (
title : Text (facet.value)
);
},
);
} else {
return const CircularProgressIndicator ();
}
},
)
Stream of facet search states StreamBuilder < FacetSearchState >(
stream : searcher.state,
builder : (context, snapshot) {
if (snapshot.hasData) {
final query = snapshot.data ? .facetQuery ?? '' ;
return Text ( 'Facet query: $ query ' );
} else {
return const CircularProgressIndicator ();
}
},
);
Methods
Triggers a search operation with given search query facetSearcher. query ( 'book' );
Applies a search state configuration and triggers a search operation facetSearcher. applyState ((state) => state. copyWith (facetQuery : 'book' ));
Gets the latest FacetSearchResponse value submitted by responses stream: final response = facetSearcher. snapshot ();
Releases all underlying resources
MultiSearcher
MultiSearcher lets you simultaneously search for hits and facet values in different indices of the same Algolia application.
It instantiates and manages HitsSearcher and FacetSearcher instances. Once created, these searchers behave like their independently instantiated counterparts.final multiSearcher = MultiSearcher (
applicationID = ApplicationID ( "YourApplicationID" ),
apiKey = APIKey ( "YourSearchOnlyApiKey" ),
eventTracker : Insights ( 'MY_APPLICATION_ID' , 'MY_API_KEY' ),
)
Methods
Releases all underlying resources
Adds a new HitsSearcher to the multi-searcher. final hitsSearcher = multiSearcher. addHitsSearcher (
initialState : const SearchState (
indexName : 'instant_search' ,
),
);
Adds a new FacetSearcher to the multi-searcher. final facetSearcher = multiSearcher. addFacetSearcher (
initialState : const FacetSearchState (
facet : 'brand' ,
searchState : SearchState (
indexName : 'instant_search' ,
),
)
);
Last modified on January 28, 2026