GroupedListView<H, I>.grid constructor

GroupedListView<H, I>.grid({
  1. Key? key,
  2. required List<I> items,
  3. required HeaderBuilder<H> headerBuilder,
  4. required Widget gridItemBuilder(
    1. BuildContext context,
    2. int itemCountInGroup,
    3. int itemIndexInGroup,
    4. I item,
    5. int itemIndexInOriginalList,
    ),
  5. required H itemGrouper(
    1. I item
    ),
  6. Comparator<H>? headerSorter,
  7. required int crossAxisCount,
  8. double crossAxisSpacing = 0,
  9. double mainAxisSpacing = 0,
  10. double itemsAspectRatio = 1,
  11. Axis scrollDirection = Axis.vertical,
  12. bool reverse = false,
  13. ScrollController? controller,
  14. bool? primary,
  15. ScrollPhysics? physics,
  16. bool shrinkWrap = true,
  17. EdgeInsetsGeometry? padding,
  18. bool addAutomaticKeepAlives = true,
  19. bool addRepaintBoundaries = true,
  20. bool addSemanticIndexes = true,
  21. double? cacheExtent,
  22. int? semanticChildCount,
  23. DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  24. ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,
  25. String? restorationId,
  26. Clip clipBehavior = Clip.hardEdge,
})

Created a GroupedListView with your List of I displayed in a GridView

Using this constructor, you'll have to provide the gridItemBuilder which is a Function that helps build the the List of items. You also have to provide at least a crossAxisCount to fix the number of items in the axis.

If you want more customization of the GridView you can (not mandatory) use also crossAxisSpacing, mainAxisSpacing and itemsAspectRatio

Also, as by default, a ListView is used, you can customise it using all the parameters you need (see ListView's documentation)

Last but not least, if you do not provide a customBuilder, you can customise the default Column used to display the H headers and List of I items. All of the fields are prefixed by items (itemsMainAxisAlignment, itemsMainAxisSize, ...)

Implementation

GroupedListView.grid({
  Key? key,
  // GroupedListView params
  required List<I> items,
  required HeaderBuilder<H> headerBuilder,
  required Widget Function(BuildContext context, int itemCountInGroup,
          int itemIndexInGroup, I item, int itemIndexInOriginalList)
      gridItemBuilder,
  required H Function(I item) itemGrouper,
  Comparator<H>? headerSorter,
  // Gridview params
  required int crossAxisCount,
  double crossAxisSpacing = 0,
  double mainAxisSpacing = 0,
  double itemsAspectRatio = 1,
  // Optional items for macro ListView
  Axis scrollDirection = Axis.vertical,
  bool reverse = false,
  ScrollController? controller,
  bool? primary,
  ScrollPhysics? physics,
  bool shrinkWrap = true,
  EdgeInsetsGeometry? padding,
  bool addAutomaticKeepAlives = true,
  bool addRepaintBoundaries = true,
  bool addSemanticIndexes = true,
  double? cacheExtent,
  int? semanticChildCount,
  DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  ScrollViewKeyboardDismissBehavior keyboardDismissBehavior =
      ScrollViewKeyboardDismissBehavior.manual,
  String? restorationId,
  Clip clipBehavior = Clip.hardEdge,
}) : this(
        key: key,
        // GroupedListView params
        items: items,
        headerBuilder: headerBuilder,
        itemsBuilder: (context, List<IndexedItem> items) {
          return GridView.count(
              scrollDirection: scrollDirection,
              crossAxisCount: crossAxisCount,
              shrinkWrap: true,
              childAspectRatio: itemsAspectRatio,
              crossAxisSpacing: crossAxisSpacing,
              mainAxisSpacing: mainAxisSpacing,
              physics: const NeverScrollableScrollPhysics(),
              children: items
                  .mapIndexed(
                    (index, item) => gridItemBuilder(
                      context,
                      items.length,
                      index,
                      item.item,
                      item.indexInOriginalList,
                    ),
                  )
                  .toList());
        },
        itemGrouper: itemGrouper,
        headerSorter: headerSorter,
        // Optional items for macro ListView
        scrollDirection: scrollDirection,
        reverse: reverse,
        controller: controller,
        primary: primary,
        physics: physics,
        shrinkWrap: shrinkWrap,
        padding: padding,
        addAutomaticKeepAlives: addAutomaticKeepAlives,
        addRepaintBoundaries: addRepaintBoundaries,
        addSemanticIndexes: addSemanticIndexes,
        cacheExtent: cacheExtent,
        semanticChildCount: semanticChildCount,
        dragStartBehavior: dragStartBehavior,
        keyboardDismissBehavior: keyboardDismissBehavior,
        restorationId: restorationId,
        clipBehavior: clipBehavior,
      );