FItemGroup.builder constructor

FItemGroup.builder({
  1. required NullableIndexedWidgetBuilder itemBuilder,
  2. int? count,
  3. FItemGroupStyle style(
    1. FItemGroupStyle
    )?,
  4. ScrollController? scrollController,
  5. double? cacheExtent,
  6. double maxHeight = double.infinity,
  7. DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  8. ScrollPhysics physics = const ClampingScrollPhysics(),
  9. bool? enabled,
  10. FItemDivider divider = FItemDivider.none,
  11. String? semanticsLabel,
  12. Key? key,
})

Creates a FItemGroup that lazily builds its children.

The itemBuilder is called for each item that should be built. The current level's FInheritedItemData is not visible to itemBuilder.

  • It may return null to signify the end of the group.
  • It may be called more than once for the same index.
  • It will be called only for indices <= count if count is given.

The count is the number of items to build. If null, itemBuilder will be called until it returns null.

Notes

May result in an infinite loop or run out of memory if:

  • Placed in a parent widget that does not constrain its size, i.e. Column.
  • count is null and itemBuilder always provides a zero-size widget, i.e. SizedBox(). If possible, provide items with non-zero size, return null from builder, or set count to non-null.

Implementation

FItemGroup.builder({
  required NullableIndexedWidgetBuilder itemBuilder,
  int? count,
  this.style,
  this.scrollController,
  this.cacheExtent,
  this.maxHeight = double.infinity,
  this.dragStartBehavior = DragStartBehavior.start,
  this.physics = const ClampingScrollPhysics(),
  this.enabled,
  this.divider = FItemDivider.none,
  this.semanticsLabel,
  super.key,
}) : assert(0 < maxHeight, 'maxHeight ($maxHeight) must be > 0'),
     assert(count == null || 0 <= count, 'count ($count) must be >= 0'),
     _builder = ((style, enabled) => SliverList.builder(
       itemCount: count,
       itemBuilder: (context, index) {
         if (itemBuilder(context, index) case final item?) {
           return FInheritedItemData.merge(
             style: style.itemStyle,
             spacing: style.spacing,
             enabled: enabled,
             dividerColor: style.dividerColor,
             dividerWidth: style.dividerWidth,
             divider: divider,
             index: index,
             last: (count != null && index == count - 1) || itemBuilder(context, index + 1) == null,
             child: item,
           );
         }

         return null;
       },
     ));