add packages, receiving & processing
This commit is contained in:
70
lib/helpers/pagination.dart
Normal file
70
lib/helpers/pagination.dart
Normal file
@@ -0,0 +1,70 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user