我试图在流构建器中设置一个Firestore流,就像他们在文档中显示的那样,但是当我更新文档或删除文档时,它没有反映在屏幕上。日志会更新,但不会更新实际屏幕。
代码:
// Chats API file
Stream<List<Message>> messagesStream({String chatID, String orderBy, bool descending, List<dynamic> startAfter, int limit}) {
return this
.collection
.document(chatID)
.collection(Config.messages)
.orderBy(orderBy, descending: descending)
.startAfter(startAfter)
.limit(limit)
.snapshots()
.map((event) => event.documents.map((documentSnapshot) => Message().model(id: documentSnapshot.documentID, map: documentSnapshot.data)).toList().reversed.toList());
}
// Chat file
Widget _streamBuilderWidget;
@override
void initState() {
super.initState();
this._streamBuilder();
if (Platform.isIOS) {
this._scrollController.addListener(() {
if (this._scrollController.position.pixels <= -135.0) {
this._checkForOldMessages();
}
});
}
}
@override
Widget build(BuildContext context) {
…
Expanded(child: this._streamBuilderWidget),
…
}
Widget _streamBuilder() {
return this._streamBuilderWidget = StreamBuilder<List<Message>>(
initialData: this._messages,
stream: APIs().chats.messagesStream(chatID: widget.chat.chatID, orderBy: 'createdAt', descending: true, startAfter: this._startAfter, limit: this._messagesLimit),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
{
return PAIndicator();
}
default:
{
if (snapshot.data.length < this._messagesLimit) {
this._hasMoreMessages = false;
} else {
this._hasMoreMessages = true;
}
snapshot.data.forEach((m) {
print(m.message); // Prints 10 values even when 1 file is changed
});
this._messages.insertAll(0, snapshot.data);
return Platform.isIOS
? MessagesList(mKey: this._listKey, scrollController: this._scrollController, messages: this._messages, aUser: widget.aUser)
: RefreshIndicator(
child: MessagesList(mKey: this._listKey, scrollController: this._scrollController, messages: this._messages, aUser: widget.aUser),
onRefresh: () async {
await Future.delayed(Duration(seconds: 1));
this._checkForOldMessages();
return null;
});
}
}
});
}
此外,当我发送消息时,该消息未添加到列表中,我必须返回并再次进入聊天室以查看最新消息。
如何使用它,这样当我打开聊天室时可以看到新消息,而只是显示最新消息以降低成本,所以我不想全部显示10000条消息。用户在聊天室中时,只有最新的内容和正在添加的内容。
注意:之所以这样,是因为出于某种原因,每当我键入它时,它都会不断重载,而当我滚动数组时,它只会自身相乘,而不会相乘。这是我在滚动时知道的将旧消息添加到数组的唯一方法。
在我重新进入聊天室之前,不会显示新消息。
答案 0 :(得分:0)
关于仅显示最新消息的方式,您应该实现分页查询并在某个滚动点之后延迟加载较旧的消息。
https://firebase.google.com/docs/firestore/query-data/query-cursors