Правильный способ использования StreamProvider с нумерацией страниц с использованием Firebase Firestore? - PullRequest
0 голосов
/ 16 марта 2020

Я реализовал чат с нумерацией страниц, используя StreamProvider, он работал нормально. Тем не менее, меня беспокоит стоимость и разум, если я реализовал правильно, потому что я не использую метод startAfter и использую только ограничения.

Вот мой код:

 int documentLimit = 20;
     @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
          child: Consumer<ChatProvider>(builder: (context, chatProvider, child) {
            bool isFirstSender = true;
            if (chatProvider.selectedChatModel != null) {
              isFirstSender = chatProvider.selectedChatModel.uids[0] == user.uuid;
            }

            return Scaffold(
                key: _scaffoldKey,
                resizeToAvoidBottomInset: true,
                appBar: ApplicationBar.getChatAppBar(context,
                    userId: chatProvider.selectedChatModel.targetId),
                body: StreamProvider<ChatModel>.value(
                    catchError: (context, object) {
                      print(object);
                      return;
                    },
                    value: Provider.of<ChatProvider>(context, listen: false)
                        .streamChatDetail(
                            chatProvider.selectedChatModel.id, isFirstSender),
                    child: StreamProvider<List<MessageModel>>.value(
                      value: Provider.of<ChatProvider>(context, listen: false)
                          .streamMessages(chatProvider.selectedChatModel.id,
                              isFirstSender, documentLimit),
                      child: ... /// The content

Тогда у меня есть слушатель прокрутки, как это:

 _scrollController.addListener(() {
      double maxScroll = _scrollController.position.maxScrollExtent;
      double currentScroll = _scrollController.position.pixels;
      if (maxScroll == currentScroll) {
        setState(() {
          documentLimit = documentLimit + 20;
        });
      }
    });

Это поток:

Stream<List<MessageModel>> getMessages(
      String uid, bool isFirstSender, int documentLimit) {
    if (uid != null && uid.isNotEmpty) {
      final DocumentReference documentReference =
          Firestore.instance.collection('user_chats').document(uid);
      Query chatDetailQuery = documentReference
          .collection("chats")
          .orderBy("date", descending: true)
          .reference()
          .limit(documentLimit);

      Stream<QuerySnapshot> chatSnapshots = chatDetailQuery.snapshots();
      return chatSnapshots.map((listChats) => listChats.documents.map((doc) {
            MessageModel messageModel = MessageModel.fromJson(doc.data);
            return messageModel;
          }).toList());
    }
    return Stream.empty();
  }

Мой вопрос:

  1. Во-первых, Я загрузил 20 сообщений чата, затем прокрутил их вверх и перезагрузил еще 20 сообщений чата. Общее количество транзакций чтения составит 40 или 60 (потому что 20 + 40)?

  2. Если ответ на первый вопрос равен 60, то как правильно реализовать разбиение на страницы для StreamProvider?

1 Ответ

0 голосов
/ 16 марта 2020

Firestore взимает плату за чтение документа, если ему нужно прочитать документ от вашего имени на сервере. Если включено кэширование диска (по умолчанию это iOS и Android), то во второй раз, когда вы читаете те же документы в описываемом вами сценарии, они будут поступать из локального кэша. В этом случае вы не будете платить за эти чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...