71 lines
1.5 KiB
Dart
71 lines
1.5 KiB
Dart
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;
|
|
}
|
|
}
|