То, что вы ищете, называется Firestore Pagination in Flutter. Обычно вам нужно вызвать первую страницу без startAtDocument
один раз, затем сохранить last_document_reference
, а затем начать использовать startAtDocument
для всех остальных страниц с обновлением last_document_reference
. Вы можете увидеть пример здесь
РЕДАКТИРОВАТЬ: Вот часть вашего кода, измененная на то, что вам нужно:
void _fetch() async {
if(_lastDoc == null) {
Firestore.instance.collection("collection")
.orderBy("name") //you can change the key "name" to whatever field key you have
.limit(2)
.snapshots()
.listen((snapshot) {
_list.addAll(snapshot.documents);
_lastDoc = _list.last;
print("length = ${_list.length}");
});
}
else {
Firestore.instance.collection("collection")
.orderBy("name") //you can change the key "name" to whatever field key you have
.startAtDocument(_lastDoc)
.limit(2)
.snapshots()
.listen((snapshot) {
_list.addAll(snapshot.documents);
_lastDoc = _list.last;
print("length = ${_list.length}");
});
}
}
Примечание 1: Вы должны управлять этими слушателями! С каждым звонком вы будете создавать новых слушателей, которыми вы должны как-то управлять. Говорить об этом здесь нецелесообразно. А в случае обновления документов вы должны соответственно управлять триггером.
Примечание 2: Вы должны использовать setState((){ _list.addAll(snapshot.documents) });
для обновления сборки (или использовать другие средства для этого) .
Редактировать 2: Думая об этом, вам нужен только прослушиватель для новых сообщений, но старые должны быть фиксированными данными без каких-либо изменений (без редактирования или удаления); Итак, вторая часть без слушателей:
else {
Firestore.instance.collection("collection")
.orderBy("name") //you can change the key "name" to whatever field key you have
.startAtDocument(_lastDoc)
.limit(2)
.getDocuments()
.then((snapshot) {
_list.addAll(snapshot.documents);
_lastDoc = _list.last;
print("length = ${_list.length}");
});
}
Я не тестировал код, но он должен быть примерно таким. Теперь у вас есть только один слушатель, который должен обновляться с новыми документами. Возможно, вам все равно придется обрабатывать изменения.