Flatter/Firestore-实施一个;分页“;在streambuilder中的动态listview上
我对逻辑进行了分析,但我遗漏了一些东西,因为唯一可行的方法是用下一个“页面”或文档替换数组,但当我对数组执行Flatter/Firestore-实施一个;分页“;在streambuilder中的动态listview上,listview,flutter,google-cloud-firestore,chat,stream-builder,Listview,Flutter,Google Cloud Firestore,Chat,Stream Builder,我对逻辑进行了分析,但我遗漏了一些东西,因为唯一可行的方法是用下一个“页面”或文档替换数组,但当我对数组执行.addAll()操作时,它会变得混乱。同样的第一批文档也会被读取,一些新文档也会被包括在内,但并不是所有应该包括的文档 代码: ScrollController _scrollController = ScrollController(); List<Message> _messages = []; List<dynamic> _startAfter = [Dat
.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();
}
}
}
}),
),
// ...
]
)
ScrollController\u ScrollController=ScrollController();
列表_消息=[];
List_startAfter=[DateTime.now()];
...
@凌驾
void initState(){
super.initState();
此._scrollController.addListener(){
如果(this._scrollController.position.minScrollExtent+this._scrollController.position.pixels为任何需要它的人找到了解决方案。唯一的问题是,这些项目只是被添加到列表中,因此它在UI/UX方面看起来不太好。如果你们都有解决方案,请随意添加。我尝试了AnimatedList,但由于陈述这个问题,我还不知道有什么解决办法
注意:由于某些原因,它不会收听来自任何用户的新消息,我必须重新进入聊天室才能看到新消息,请提供帮助
GlobalKey<AnimatedListState> _listKey = GlobalKey();
ScrollController _scrollController = ScrollController();
List<Message> _messages = [];
List<dynamic> _startAfter = [DateTime.now()];
int _messagesLimit = 10;
bool _hasMoreMessages = false;
@override
void initState() {
super.initState();
if (Platform.isIOS) {
this._scrollController.addListener(() {
if (this._scrollController.position.pixels >= this._scrollController.position.maxScrollExtent + 150.0) {
this._checkForOldMessages();
}
});
}
}
@override
Widget build(BuildContext context) {
Widget w = WillPopScope(
child: Stack(
children: <Widget>[
Column(
children: <Widget>[
Expanded(child: this._streamBuilderWidget()),
// …
],
),
],
),
onWillPop: () {});
…
}
Widget _streamBuilderWidget() {
return 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);
});
if (!ListEquality().equals(this._messages, snapshot.data)) {
snapshot.data.forEach((m) {
this._messages.add(m);
});
} else {
print('nonononono');
}
// Doesn't Work...
// if (mounted) this._listKey.currentState.insertItem(this._messages.length - 1, duration: Duration(milliseconds: 500));
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;
});
}
}
});
}
_checkForOldMessages() {
if (this._hasMoreMessages) {
print('Adding More...');
setState(() {
this._startAfter = [this._messages.last.createdAt.toDate()];
});
this._streamBuilderWidget();
}
}
GlobalKey\u listKey=GlobalKey();
ScrollController_ScrollController=ScrollController();
列表_消息=[];
List_startAfter=[DateTime.now()];
int _messagesLimit=10;
bool\u hasMoreMessages=false;
@凌驾
void initState(){
super.initState();
if(Platform.isIOS){
此._scrollController.addListener(){
如果(this.\u scrollController.position.pixels>=this.\u scrollController.position.maxScrollExtent+150.0){
这是。_checkForOldMessages();
}
});
}
}
@凌驾
小部件构建(构建上下文){
Widget w=WillPopScope(
子:堆栈(
儿童:[
纵队(
儿童:[
已展开(子项:this.\u streamBuilderWidget()),
// …
],
),
],
),
onWillPop:({});
…
}
Widget_streamBuilderWidget(){
返回流生成器(
initialData:这是.\u消息,
stream:api().chats.messagessstream(chatID:widget.chat.chatID,orderBy:'createdAt',降序:true,startAfter:this.\u startAfter,limit:this.\u messagesLimit),
生成器:(上下文,快照){
交换机(快照.连接状态){
案例连接状态。正在等待:
{
返回PAIndicator();
}
违约:
{
if(snapshot.data.length
为任何需要它的人找到了解决方案。唯一的问题是,这些项目只是添加到列表中,因此看起来不太符合UI/UX。如果你们都有解决方案,请随意添加。我尝试了AnimatedList,但由于状态问题,它不起作用,我还不知道有什么解决方法
注意:由于某些原因,它不会收听来自任何用户的新消息,我必须重新进入聊天室才能看到新消息,请提供帮助
GlobalKey<AnimatedListState> _listKey = GlobalKey();
ScrollController _scrollController = ScrollController();
List<Message> _messages = [];
List<dynamic> _startAfter = [DateTime.now()];
int _messagesLimit = 10;
bool _hasMoreMessages = false;
@override
void initState() {
super.initState();
if (Platform.isIOS) {
this._scrollController.addListener(() {
if (this._scrollController.position.pixels >= this._scrollController.position.maxScrollExtent + 150.0) {
this._checkForOldMessages();
}
});
}
}
@override
Widget build(BuildContext context) {
Widget w = WillPopScope(
child: Stack(
children: <Widget>[
Column(
children: <Widget>[
Expanded(child: this._streamBuilderWidget()),
// …
],
),
],
),
onWillPop: () {});
…
}
Widget _streamBuilderWidget() {
return 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);
});
if (!ListEquality().equals(this._messages, snapshot.data)) {
snapshot.data.forEach((m) {
this._messages.add(m);
});
} else {
print('nonononono');
}
// Doesn't Work...
// if (mounted) this._listKey.currentState.insertItem(this._messages.length - 1, duration: Duration(milliseconds: 500));
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;
});
}
}
});
}
_checkForOldMessages() {
if (this._hasMoreMessages) {
print('Adding More...');
setState(() {
this._startAfter = [this._messages.last.createdAt.toDate()];
});
this._streamBuilderWidget();
}
}
GlobalKey\u listKey=GlobalKey();
ScrollController_ScrollController=ScrollController();
列表_消息=[];
List_startAfter=[DateTime.now()];
int _messagesLimit=10;
bool\u hasMoreMessages=false;
@凌驾
void initState(){
super.initState();
if(Platform.isIOS){
此._scrollController.addListener(){
如果(this.\u scrollController.position.pixels>=this.\u scrollController.position.maxScrollExtent+150.0){
这是。_checkForOldMessages();
}
});
}
}
@凌驾
小部件构建(构建上下文){
Widget w=WillPopScope(
子:堆栈(
儿童:[
纵队(
儿童:[
已展开(子项:this.\u streamBuilderWidget()),
// …
],
),
],
),
onWillPop:({});
…
}
Widget_streamBuilderWidget(){
返回流生成器(
initialData:这是.\u消息,
stream:api().chats.messagessstream(chatID:widget.chat.chatID,orderBy:'createdAt',降序:true,startAfter:this.\u startAfter,limit:this.\u messagesLimit),
生成器:(上下文,快照){
交换机(快照.连接状态){
案例连接状态。正在等待:
{
返回PAIndicator();
}
违约:
{
如果(捕捉)