FItemGroup.builder constructor

FItemGroup.builder({
  1. required NullableIndexedWidgetBuilder itemBuilder,
  2. int? count,
  3. FItemGroupStyleDelta style = const .context(),
  4. ScrollController? scrollController,
  5. double? cacheExtent,
  6. double maxHeight = .infinity,
  7. DragStartBehavior dragStartBehavior = .start,
  8. ScrollPhysics physics = const ClampingScrollPhysics(),
  9. bool? enabled,
  10. FItemDivider divider = .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.

Contract

Throws AssertionError if used in a intrinsic FItemGroup.merge.

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 = const .context(),
  this.scrollController,
  this.cacheExtent,
  this.maxHeight = .infinity,
  this.dragStartBehavior = .start,
  this.physics = const ClampingScrollPhysics(),
  this.enabled,
  this.divider = .none,
  this.semanticsLabel,
  super.key,
}) : assert(0 < maxHeight, 'maxHeight ($maxHeight) must be > 0'),
     assert(count == null || 0 <= count, 'count ($count) must be >= 0'),
     intrinsicWidth = null,
     _builder = ((style, enabled, intrinsicWidth) {
       assert(!intrinsicWidth, 'FItemGroup.builder does not support intrinsic width.');
       return SliverList.builder(
         itemCount: count,
         itemBuilder: (context, index) {
           if (itemBuilder(context, index) case final item?) {
             return FInheritedItemData.merge(
               styles: style.itemStyles,
               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;
         },
       );
     });