Использование потоков во флаттере

Я работаю над приложением чата, и я пытаюсь использовать разбиение на страницы для извлечения ограниченного объема данных из хранилища огня и извлечения остальных, когда пользователь продолжает прокрутку, я также хочу прослушивать последние изменения в базе данных и отображать их в Пользователь. Я попытался сделать это, создав класс 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);
      }


    });

person V-Ghost    schedule 28.12.2020    source источник
comment
API-интерфейсы Firestore отнюдь не упрощают одновременную разбивку на страницы и получение обновлений в реальном времени. Если вы хотите сделать это правильно, вам придется приложить немало усилий для добавления слушателей к каждой странице данных отдельно и обработать все крайние случаи, когда результаты запроса меняют положение.   -  person Doug Stevenson    schedule 29.12.2020
comment
О, ладно, это звучит очень сложно, но спасибо   -  person V-Ghost    schedule 29.12.2020


Ответы (1)


API-интерфейсы Firestore отнюдь не упрощают одновременную разбивку на страницы и получение обновлений в реальном времени. Если вы хотите сделать это правильно, вам придется приложить много усилий, чтобы добавить слушателей к каждой странице данных отдельно и обработать все граничные случаи, когда результаты запроса меняют позиции.

person Community    schedule 29.12.2020