streamQueryList method

Stream<List<T>> streamQueryList({
  1. List<OrderBy>? orderBy,
  2. List<QueryArgsV2>? args,
  3. int? limit,
  4. dynamic startAfter,
  5. dynamic startAt,
  6. dynamic endBefore,
  7. dynamic endAt,
})

Returns the list of documents from collection, in the order provided in orderBy and matches the args supplied as a stream so that changes can be listened. Use startAfter, startAt, endAt, endBefore to perform cursor based queries and pagination of data

Implementation

Stream<List<T>> streamQueryList({
  List<OrderBy>? orderBy,
  List<QueryArgsV2>? args,
  int? limit,
  dynamic startAfter,
  dynamic startAt,
  dynamic endBefore,
  dynamic endAt,
}) {
  CollectionReference collref = _db.collection(collection);
  Query? ref;
  if (orderBy != null) {
    orderBy.forEach((order) {
      if (ref == null)
        ref = collref.orderBy(order.field, descending: order.descending);
      else
        ref = ref!.orderBy(order.field, descending: order.descending);
    });
  }
  if (args != null) {
    for (final arg in args) {
      if (ref == null)
        ref = collref.where(
          arg.key,
          isEqualTo: arg.isEqualTo,
          isNotEqualTo: arg.isNotEqualTo,
          isGreaterThan: arg.isGreaterThan,
          isGreaterThanOrEqualTo: arg.isGreaterThanOrEqualTo,
          isLessThan: arg.isLessThan,
          isLessThanOrEqualTo: arg.isLessThanOrEqualTo,
          isNull: arg.isNull,
          arrayContains: arg.arrayContains,
          arrayContainsAny: arg.arrayContainsAny,
          whereIn: arg.whereIn,
          whereNotIn: arg.whereNotIn,
        );
      else
        ref = ref!.where(
          arg.key,
          isEqualTo: arg.isEqualTo,
          isNotEqualTo: arg.isNotEqualTo,
          isGreaterThan: arg.isGreaterThan,
          isGreaterThanOrEqualTo: arg.isGreaterThanOrEqualTo,
          isLessThan: arg.isLessThan,
          isLessThanOrEqualTo: arg.isLessThanOrEqualTo,
          isNull: arg.isNull,
          arrayContains: arg.arrayContains,
          arrayContainsAny: arg.arrayContainsAny,
          whereIn: arg.whereIn,
          whereNotIn: arg.whereNotIn,
        );
    }
  }
  if (limit != null) {
    if (ref == null)
      ref = collref.limit(limit);
    else
      ref = ref!.limit(limit);
  }
  if (startAfter != null && orderBy != null) {
    ref = ref!.startAfter([startAfter]);
  }
  if (startAt != null && orderBy != null) {
    ref = ref!.startAt([startAt]);
  }
  if (endAt != null && orderBy != null) {
    ref = ref!.endAt([endAt]);
  }
  if (endBefore != null && orderBy != null) {
    ref = ref!.endBefore([endBefore]);
  }
  if (ref != null)
    return ref!.snapshots().map((snap) => snap.docs
        .map((doc) => fromDS(doc.id, doc.data() as Map<String, dynamic>))
        .toList());
  else
    return collref.snapshots().map((snap) => snap.docs
        .map((doc) => fromDS(doc.id, doc.data() as Map<String, dynamic>))
        .toList());
}