FirestoreListView<Document>.separated constructor

FirestoreListView<Document>.separated({
  1. Key? key,
  2. required Query<Document> query,
  3. required FirestoreItemBuilder<Document> itemBuilder,
  4. int pageSize = 10,
  5. FirestoreLoadingBuilder? loadingBuilder,
  6. FirestoreFetchingIndicatorBuilder? fetchingIndicatorBuilder,
  7. FirestoreErrorBuilder? errorBuilder,
  8. FirestoreEmptyBuilder? emptyBuilder,
  9. required IndexedWidgetBuilder separatorBuilder,
  10. Axis scrollDirection = Axis.vertical,
  11. bool showFetchingIndicator = false,
  12. bool reverse = false,
  13. ScrollController? controller,
  14. bool? primary,
  15. ScrollPhysics? physics,
  16. bool shrinkWrap = false,
  17. EdgeInsetsGeometry? padding,
  18. ChildIndexGetter? findChildIndexCallback,
  19. bool addAutomaticKeepAlives = true,
  20. bool addRepaintBoundaries = true,
  21. bool addSemanticIndexes = true,
  22. double? cacheExtent,
  23. DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  24. ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,
  25. String? restorationId,
  26. Clip clipBehavior = Clip.hardEdge,
})

Shows a separator between list items just as in ListView.separated

Implementation

FirestoreListView.separated({
  super.key,
  required super.query,
  required FirestoreItemBuilder<Document> itemBuilder,
  super.pageSize,
  FirestoreLoadingBuilder? loadingBuilder,
  FirestoreFetchingIndicatorBuilder? fetchingIndicatorBuilder,
  FirestoreErrorBuilder? errorBuilder,
  FirestoreEmptyBuilder? emptyBuilder,
  required IndexedWidgetBuilder separatorBuilder,
  Axis scrollDirection = Axis.vertical,
  bool showFetchingIndicator = false,
  bool reverse = false,
  ScrollController? controller,
  bool? primary,
  ScrollPhysics? physics,
  bool shrinkWrap = false,
  EdgeInsetsGeometry? padding,
  ChildIndexGetter? findChildIndexCallback,
  bool addAutomaticKeepAlives = true,
  bool addRepaintBoundaries = true,
  bool addSemanticIndexes = true,
  double? cacheExtent,
  DragStartBehavior dragStartBehavior = DragStartBehavior.start,
  ScrollViewKeyboardDismissBehavior keyboardDismissBehavior =
      ScrollViewKeyboardDismissBehavior.manual,
  String? restorationId,
  Clip clipBehavior = Clip.hardEdge,
}) : super(
        builder: (context, snapshot, _) {
          if (snapshot.isFetching) {
            return loadingBuilder?.call(context) ??
                const Center(child: CircularProgressIndicator());
          }

          if (snapshot.hasError && errorBuilder != null) {
            return errorBuilder(
              context,
              snapshot.error!,
              snapshot.stackTrace!,
            );
          }

          if (snapshot.docs.isEmpty && emptyBuilder != null) {
            return emptyBuilder(context);
          }

          final itemCount = snapshot.docs.length;

          return ListView.separated(
            itemCount: itemCount,
            itemBuilder: (context, index) {
              final isLastItem = index + 1 == itemCount;
              if (!showFetchingIndicator && isLastItem && snapshot.hasMore) {
                snapshot.fetchMore();
              }

              final doc = snapshot.docs[index];
              return showFetchingIndicator
                  ? OnMountListener(
                      onMount: () {
                        if (isLastItem && snapshot.hasMore) {
                          snapshot.fetchMore();
                        }
                      },
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          itemBuilder(context, doc),
                          if (isLastItem && snapshot.hasMore)
                            fetchingIndicatorBuilder?.call(context) ??
                                const Padding(
                                  padding: EdgeInsets.symmetric(
                                    vertical: 16.0,
                                  ),
                                  child: Center(
                                    child: LoadingIndicator(
                                      size: 30.0,
                                      borderWidth: 2.0,
                                    ),
                                  ),
                                ),
                        ],
                      ),
                    )
                  : itemBuilder(context, doc);
            },
            separatorBuilder: separatorBuilder,
            scrollDirection: scrollDirection,
            reverse: reverse,
            controller: controller,
            primary: primary,
            physics: physics,
            shrinkWrap: shrinkWrap,
            padding: padding,
            findChildIndexCallback: findChildIndexCallback,
            addAutomaticKeepAlives: addAutomaticKeepAlives,
            addRepaintBoundaries: addRepaintBoundaries,
            addSemanticIndexes: addSemanticIndexes,
            cacheExtent: cacheExtent,
            dragStartBehavior: dragStartBehavior,
            keyboardDismissBehavior: keyboardDismissBehavior,
            restorationId: restorationId,
            clipBehavior: clipBehavior,
          );
        },
      );