Refinement widgets
On this page
Algolia for Flutter is beta software according to Algolia’s Terms of Service (“Beta Services”). To share feedback or report a bug, open an issue.
Configure your filters with FacetList fields in the search_repository.dart file. 
Behind the scenes, the FacetList uses a FilterState to apply and listen to filters changes, and a HitsSearcher to update the search state and get the list of facets from search operations.
You can refine these facets:
Brand filter
Use the Brand filter to only show search results from one or more brands.

Configure the brand filter
To configure the brand filter, edit the search_repository.dart file:
1
2
3
4
5
late final _brandFacetList = FacetList(
  searcher: _hitsSearcher,
  filterState: _filterState,
  attribute: 'brand',
);
Code summary
You can customize the filters view in brand_selector_view.dart file.
Usage and props
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class BrandSelectorView extends StatelessWidget {
  const BrandSelectorView(
      {super.key, required this.facets, required this.onToggle});
  final Stream<List<SelectableFacet>> facets;
  final Function(String) onToggle;
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<SelectableFacet>>(
        stream: facets,
        builder: (context, snapshot) {
          final facets = snapshot.data ?? [];
          return SliverFixedExtentList(
              itemExtent: 44,
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  final facet = facets[index];
                  return InkWell(
                    child: Row(children: [
                      Icon(
                        facet.isSelected
                            ? Icons.check_box
                            : Icons.check_box_outline_blank,
                      ),
                      const SizedBox(
                        width: 5,
                      ),
                      Text(facet.item.value),
                      const Spacer(),
                      Text(facet.item.count > 0 ? '${facet.item.count}' : ''),
                    ]),
                    onTap: () => onToggle(facet.item.value),
                  );
                },
                childCount: facets.length,
              ));
        });
  }
}
      Size filter
Use the Size filter to only show search results matching one or more product sizes.

Configure the size filter
To configure the size filter, edit the search_repository.dart file:
1
2
3
4
5
late final _sizeFacetList = FacetList(
  searcher: _hitsSearcher,
  filterState: _filterState,
  attribute: 'available_sizes',
);
Code summary
You can customize the filters view in size_selector_view.dart file.
Usage and props
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class SizeSelectorView extends StatelessWidget {
  const SizeSelectorView(
      {super.key, required this.facets, required this.onToggle});
  final Stream<List<SelectableFacet>> facets;
  final Function(String) onToggle;
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<SelectableFacet>>(
        stream: facets,
        builder: (context, snapshot) {
          final facets = snapshot.data ?? [];
          return SliverGrid(
              gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 65.0,
                mainAxisSpacing: 10.0,
                crossAxisSpacing: 10.0,
                childAspectRatio: 2.5,
              ),
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  final facet = facets[index];
                  if (facet.isSelected) {
                    return ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          backgroundColor: AppTheme.darkBlue,
                          padding: const EdgeInsets.all(2),
                        ),
                        onPressed: () => onToggle(facet.item.value),
                        child: Text(facet.item.value));
                  } else {
                    return OutlinedButton(
                        style: OutlinedButton.styleFrom(
                          foregroundColor: AppTheme.darkBlue,
                          side: const BorderSide(
                              width: 1.0,
                              color: AppTheme.darkBlue,
                              style: BorderStyle.solid),
                          padding: const EdgeInsets.all(2),
                        ),
                        onPressed: () => onToggle(facet.item.value),
                        child: Text(facet.item.value));
                  }
                },
                childCount: facets.length,
              ));
        });
  }
}