XListView<T> function

ListView XListView<T>({
  1. Key? key,
  2. List<T>? items,
  3. Widget itemView(
    1. ContextIndexItem<T>
    )?,
  4. Widget? lastItemView(
    1. BuildContext
    )?,
  5. NullableIndexedWidgetBuilder? itemBuilder,
  6. int? itemCount,
  7. IndexedWidgetBuilder? separatorBuilder,
  8. bool reverse = false,
  9. Axis scrollDirection = Axis.vertical,
  10. bool separator = false,
  11. double separatorIndentStart = 0,
  12. double separatorIndentEnd = 0,
  13. ScrollController? controller,
  14. bool? primary,
  15. ScrollPhysics? physics,
  16. bool shrinkWrap = false,
  17. EdgeInsetsGeometry? padding,
  18. double? itemExtent,
  19. double? itemExtentBuilder(
    1. int,
    2. SliverLayoutDimensions
    )?,
  20. Widget? prototypeItem,
  21. int? findChildIndexCallback(
    1. Key
    )?,
  22. bool addAutomaticKeepAlives = true,
  23. bool addRepaintBoundaries = true,
  24. bool addSemanticIndexes = true,
  25. double? cacheExtent,
  26. int? semanticChildCount,
  27. DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  28. ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,
  29. String? restorationId,
  30. Clip clipBehavior = Clip.hardEdge,
  31. HitTestBehavior hitTestBehavior = HitTestBehavior.opaque,
})

Implementation

ListView XListView<T>({
  Key? key,
  List<T>? items,
  Widget Function(ContextIndexItem<T>)? itemView,
  Widget? Function(BuildContext)? lastItemView,
  NullableIndexedWidgetBuilder? itemBuilder,
  int? itemCount,
  IndexedWidgetBuilder? separatorBuilder,
  bool reverse = false,
  Axis scrollDirection = Axis.vertical,
  bool separator = false,
  double separatorIndentStart = 0,
  double separatorIndentEnd = 0,
  ScrollController? controller,
  bool? primary,
  ScrollPhysics? physics,
  bool shrinkWrap = false,
  EdgeInsetsGeometry? padding,
  double? itemExtent,
  double? Function(int, SliverLayoutDimensions)? itemExtentBuilder,
  Widget? prototypeItem,
  int? Function(Key)? findChildIndexCallback,
  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,
  HitTestBehavior hitTestBehavior = HitTestBehavior.opaque,
}) {
  IndexedWidgetBuilder? sepBuilder =
      separatorBuilder ?? (separator ? (c, i) => Divider(height: 1, thickness: 1, indent: separatorIndentStart, endIndent: separatorIndentEnd) : null);
  Widget? buildItemViewRawIndex(BuildContext context, int index) {
    if (items != null) {
      if (index >= 0 && index < items.length) {
        if (itemView != null) return itemView.call(ContextIndexItem(context, index, items[index]));
      } else if (index == items.length) {
        if (lastItemView != null) return lastItemView(context);
      }
    }
    return itemBuilder?.call(context, index);
  }

  Widget? buildItemView(BuildContext context, int index) {
    if (sepBuilder == null) {
      return buildItemViewRawIndex(context, index);
    }
    int itemIndex = index ~/ 2;
    if (index.isEven) {
      return buildItemViewRawIndex(context, itemIndex);
    }
    return sepBuilder(context, itemIndex);
  }

  int? itemLen = items?.length;
  if (itemLen != null && lastItemView != null) {
    itemLen += 1;
  }
  int? count = itemCount ?? itemLen;

  if (count != null && sepBuilder != null) {
    count = math.max(0, count * 2 - 1);
  }
  return ListView.builder(
    itemBuilder: buildItemView,
    itemCount: count,
    controller: controller,
    reverse: reverse,
    scrollDirection: scrollDirection,
    primary: primary,
    physics: physics,
    shrinkWrap: shrinkWrap,
    padding: padding,
    itemExtent: itemExtent,
    itemExtentBuilder: itemExtentBuilder,
    prototypeItem: prototypeItem,
    findChildIndexCallback: findChildIndexCallback,
    addAutomaticKeepAlives: addAutomaticKeepAlives,
    addRepaintBoundaries: addRepaintBoundaries,
    addSemanticIndexes: addSemanticIndexes,
    cacheExtent: cacheExtent,
    semanticChildCount: semanticChildCount,
    dragStartBehavior: dragStartBehavior,
    keyboardDismissBehavior: keyboardDismissBehavior,
    restorationId: restorationId,
    clipBehavior: clipBehavior,
    hitTestBehavior: hitTestBehavior,
  );
}