import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:logging/logging.dart'; /* * Pagination load data in page */ class Pagination { final log = Logger('PaginationModel'); final int rowPerLoad; DocumentSnapshot prev; bool ended = false; Query pageQuery; Pagination(Query pageQuery, {this.rowPerLoad = 20}) { this.pageQuery = pageQuery; initData(); } void initData() async { _clearState(); load(); } void _clearState() { prev = null; ended = false; if (controller != null) controller.close(); } StreamController controller; Stream get stream { if (controller != null) { controller.close(); } controller = StreamController(onCancel: _clearState); return controller.stream; } void close() { _clearState(); } Future load() async { Query _query = prev != null ? pageQuery.startAfterDocument(prev) : pageQuery; try { await _query .limit(rowPerLoad) .getDocuments(source: Source.server) .then((QuerySnapshot snapshot) { int count = snapshot.documents.length; ended = count < rowPerLoad; prev = count > 0 ? snapshot.documents[count - 1] : prev; snapshot.documents.forEach((e) { controller.add(e); }); if (ended) { controller.add(null); } }); } catch (e) { log.warning("Error!! $e"); } return ended; } }