Я работаю над приложением чата, и я пытаюсь использовать разбиение на страницы для извлечения ограниченного объема данных из хранилища огня и извлечения остальных, когда пользователь продолжает прокрутку, я также хочу прослушивать последние изменения в базе данных и отображать их в Пользователь. Я попытался сделать это, создав класс Stream, который содержит прослушиватель моментальных снимков в конструкторе и добавляет любые новые изменения в контроллер потока, у него также есть метод, который извлекает данные с разбивкой на страницы и добавляет их в контроллер потока, когда пользователь прокручивает. Проблема в том, что когда данные извлекаются из базы данных и добавляются в контроллер потока, они заменяют предыдущие данные, а не добавляют к ним. Ниже представлен созданный мной класс
class ChatStream {
final String messageId;
final _controller = StreamController<QuerySnapshot>();
var _snapshots;
ChatStream({this.messageId}) {
_snapshots = FirebaseFirestore.instance
.collection("chats")
.doc(messageId)
.collection("messages")
.orderBy("time", descending: false)
.limitToLast(10)
.snapshots();
_snapshots.listen((onData) {
_controller.sink.add(onData);
});
}
getChats(DocumentSnapshot lastDocument) async {
FirebaseFirestore.instance
.collection("chats")
.doc(messageId)
.collection("messages")
.orderBy("time", descending: false)
.endBeforeDocument(lastDocument)
.limitToLast(100)
.snapshots()
.forEach((action) {
_controller.sink.add(action);
});
}
Stream get stream {
return _controller.stream;
}
}
Я создал объект типа ChatStream
с именем c, затем я получил поток, использующий c.stream
для использования в streambuilder, и я вызвал метод getChats, используя прослушиватель прокрутки в методе initState, например, так
_scrollController.addListener(() {
double maxScroll = _scrollController.position.minScrollExtent;
double currentScroll = _scrollController.position.pixels;
double delta = MediaQuery.of(context).size.height * 0.20;
if (maxScroll == currentScroll) {
c.getChats(lastDocument);
}
});