Я реализовал чат с нумерацией страниц, используя 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();
}
Мой вопрос:
Во-первых, Я загрузил 20 сообщений чата, затем прокрутил их вверх и перезагрузил еще 20 сообщений чата. Общее количество транзакций чтения составит 40 или 60 (потому что 20 + 40)?
Если ответ на первый вопрос равен 60, то как правильно реализовать разбиение на страницы для StreamProvider?