【发布时间】:2019-10-25 03:38:06
【问题描述】:
我想出了逻辑并且它可以工作,但是我遗漏了一些东西,因为这种工作的唯一方法是当我用下一个“页面”或文档替换数组时,但是当我对它执行 .addAll() 时,它得到杂乱。相同的第一个文档被读取,一些新文档也被包含在内,但并不是所有应该包含的内容。
代码:
ScrollController _scrollController = ScrollController();
List<Message> _messages = [];
List<dynamic> _startAfter = [DateTime.now()];
...
@override
void initState() {
super.initState();
this._scrollController.addListener(() {
if (this._scrollController.position.minScrollExtent + this._scrollController.position.pixels <= -15.0) {
setState(() {
this._startAfter = [this._messages.first.createdAt.toDate()];
});
}
});
}
...
Column(
children: <Widget>[
Expanded(
child: StreamBuilder<List<Message>>(
stream: APIs().chats.messagesStream(chatID: widget.chat.chatID, orderBy: 'createdAt', descending: true, startAfter: this._startAfter, limit: 10),
builder: (context, snapshot) {
print(this._startAfter);
switch (snapshot.connectionState) {
case ConnectionState.waiting:
{
return PAIndicator();
}
default:
{
if (snapshot.hasData) {
this._messages = snapshot.data; // Having the issue here.
// this._messages.addAll(snapshot.data); Causes problems when rebuilding
return MessagesList(
scrollController: this._scrollController,
messages: this._messages,
aUser: widget.aUser,
);
} else {
return ListView();
}
}
}
}),
),
// ...
]
)
我注意到该错误仅在重建时发生。
当检索到数据时,它会替换数组中的内容,当使用.addAll() 时,我如何只追加数据而不是仅仅替换它或给出相同消息的多个相同值,而不用担心 ui 被重建,比如键盘显示和关闭?
另外,如果没有更多文档,我如何确保它不会被重建或调用 firebase? (解决了,现在只剩下上面的主要问题了)
【问题讨论】:
标签: listview flutter google-cloud-firestore chat stream-builder