gpt4 book ai didi

flutter - 在 flutter 中使用 Firebase 实时数据库数据创建无限滚动效果

转载 作者:行者123 更新时间:2023-12-03 08:00:16 25 4
gpt4 key购买 nike

我正在我的移动应用程序中集成聊天功能,并决定使用 Firebase 实时数据库作为后端而不是 Firestore 作为降低成本的机制。然而,我遇到了一个问题。关于如何使用实时数据库而不是Firestore中的数据创建无限滚动的文档似乎非常稀疏。

以下是我的聊天消息的组织。这是我想使用的查询:

FirebaseDatabase.instance
.ref("messages/${widget.placeID}")
.orderByChild("timeStamp")

这是我想要为每个结果返回的小部件:

MessageWidget(
message: message.text,
id: message.uid,
name: message.name,
lastSender: message.lastSender,
date: message.timeStamp,
profilePicture: message.profilePicture,
);

这是数据库结构
enter image description here

查询有效,并且我已经根据查询的 JSON 响应编写了 MessageWidget。我所需要的只是每当查询到达滚动顶部时就调用该查询,并加载更多 MessageWdiget。另请注意,这是一个聊天应用程序,用户可以向上滚动以加载较旧的消息,并将其添加到上一条消息之上。

谢谢!

编辑:这是我当前拥有的代码:

Flexible(
child: StreamBuilder(
stream: FirebaseDatabase.instance
.ref("messages/${widget.placeID}")
.orderByChild("timeStamp")
.limitToLast(20)
.onValue,
builder:
(context, AsyncSnapshot<DatabaseEvent> snapshot) {
if (!snapshot.hasData) {
return const CircularProgressIndicator();
} else {
Map<dynamic, dynamic> map =
snapshot.data!.snapshot.value as dynamic;
List<dynamic> list = [];
list.clear();
list = map.values.toList();
return Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(bottom: 20),
child: ListView.builder(
controller: _scrollController,
// shrinkWrap: true,
itemCount: list.length,
itemBuilder: (context, index) {
final json = list[index]
as Map<dynamic, dynamic>;
final message = Message.fromJson(json);
return MessageWidget(
message: message.text,
id: message.uid,
name: message.name,
lastSender: message.lastSender,
date: message.timeStamp,
profilePicture:
message.profilePicture,
);
}),
),
);
}
},
),
),

我的initState

void initState() {
super.initState();

_scrollController.addListener(() {
if (_scrollController.position.atEdge) {
bool isTop = _scrollController.position.pixels == 0;
if (isTop) {
//add more messages

} else {
print('At the bottom');
}
}
});
}

最佳答案

您的代码已加载所有消息。


如果您想要加载最大数量的消息,您需要对加载的消息数量进行限制。如果您只想加载最新消息,则可以使用 limitToLast这样做 - 因为当您按timeStamp排序时,最新消息是最后的。值。

因此,例如,要仅加载 10 条最新消息,您可以使用:

FirebaseDatabase.instance
.ref("messages/${widget.placeID}")
.orderByChild("timeStamp")
.limitToLast(10);

这为您提供了最初在应用程序中显示的有限数量的消息。


现在,当滚动到达屏幕顶部时,您需要加载之前的 10 条消息。为此,您需要了解timeStamp屏幕顶部消息的值和键 - 也就是您迄今为止显示的最旧消息的键。

使用这两个值,您可以加载前 10 个值:

FirebaseDatabase.instance
.ref("messages/${widget.placeID}")
.orderByChild("timeStamp")
.endBefore(timeStampValueOfOldestSeenItem, keyOfOldestSeenItem)
.limitToLast(10);

这里的数据库再次对timeStamp上的节点进行排序。 ,然后它会根据您给出的值找到屏幕顶部的节点,然后返回之前的 10 个节点。

关于flutter - 在 flutter 中使用 Firebase 实时数据库数据创建无限滚动效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74562550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com