Files
fcs/lib/helpers/paginator.dart

71 lines
1.6 KiB
Dart
Raw Normal View History

2020-10-12 03:34:05 +06:30
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
2020-10-15 19:40:03 +06:30
import 'package:fcs/pages/widgets/callbacks.dart';
2020-10-12 03:34:05 +06:30
import 'package:logging/logging.dart';
2020-10-15 19:40:03 +06:30
typedef ToObj = Function(Map<String, dynamic> data, String id);
2020-10-12 03:34:05 +06:30
/*
* Pagination load data in page
*/
2020-10-15 19:40:03 +06:30
class Paginator<T> {
final log = Logger('Paginator');
2020-10-12 03:34:05 +06:30
final int rowPerLoad;
DocumentSnapshot prev;
bool ended = false;
2020-10-15 19:40:03 +06:30
bool isLoading = false;
List<T> values = [];
ToObj toObj;
2020-10-12 03:34:05 +06:30
Query pageQuery;
2020-10-15 19:40:03 +06:30
Paginator(this.pageQuery, {this.rowPerLoad = 20, this.toObj}) {
2020-10-12 03:34:05 +06:30
_clearState();
}
void _clearState() {
prev = null;
ended = false;
2020-10-15 19:40:03 +06:30
isLoading = false;
values = [];
2020-10-12 03:34:05 +06:30
}
2020-10-15 19:40:03 +06:30
void close() {
_clearState();
2020-10-12 03:34:05 +06:30
}
2020-10-15 19:40:03 +06:30
Future<void> refresh({CallBack onFinished}) async {
2020-10-12 03:34:05 +06:30
_clearState();
2020-10-15 19:40:03 +06:30
await load();
if (onFinished != null) onFinished();
2020-10-12 03:34:05 +06:30
}
2020-10-15 19:40:03 +06:30
Future<bool> load({CallBack onFinished}) async {
if (ended) return null;
isLoading = true;
2020-10-12 03:34:05 +06:30
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) {
2020-10-15 19:40:03 +06:30
values.add(toObj(e.data, e.documentID));
2020-10-12 03:34:05 +06:30
});
});
} catch (e) {
log.warning("Error!! $e");
2020-10-15 19:40:03 +06:30
} finally {
isLoading = false;
if (onFinished != null) onFinished();
2020-10-12 03:34:05 +06:30
}
return ended;
}
}