我想出了逻辑并且它可以工作,但是我遗漏了一些东西,因为这样做的唯一方法是当我用下一个“页面”或文档替换数组时,但是当我对其进行操作.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?(解决了,现在只剩下上面的主要问题了)