Files
fcs/lib/helpers/pagination.dart

71 lines
1.5 KiB
Dart
Raw Normal View History

2020-10-12 03:34:05 +06:30
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<DocumentSnapshot> controller;
Stream<DocumentSnapshot> get stream {
if (controller != null) {
controller.close();
}
controller = StreamController<DocumentSnapshot>(onCancel: _clearState);
return controller.stream;
}
void close() {
_clearState();
}
Future<bool> 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;
}
}