gpt4 book ai didi

flutter - 如何将延迟加载添加到此列表?

转载 作者:行者123 更新时间:2023-12-04 01:28:40 31 4
gpt4 key购买 nike

这就是我从 firebase firestore 获取 postList 中的帖子的方式,我需要一个函数来滚动获取更多帖子。下一组帖子必须在此初始列表中显示的最后一个帖子之后开始,并在用户滚动时添加到此列表,只要 firestore 中有帖子。

class _FeedScreenState extends State<FeedScreen> {
List<Post> _posts = [];
ScrollController _controller = ScrollController();

@override
void initState() {
super.initState();
_setupFeed();
_controller.addListener(_scrollListener);
}

_scrollListener() {
setState(() {
if (_controller.position.atEdge) {
if (_controller.position.pixels == 0) {


} else {
_getMore();

}
}
});
}
_setupFeed() async {
List<Post> posts = await DatabaseService.getFeedPosts(widget.currentUserId);
setState(() {
_posts = posts;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
title: Text(
'New List',
style: TextStyle(
color: Colors.black,
fontSize: 35.0,
),
),
),
body: RefreshIndicator(
onRefresh: () => _setupFeed(),
child: ListView.builder(
controller: _controller,
itemCount: _posts.length,
itemBuilder: (BuildContext context, int index) {
Post post = _posts[index];
return FutureBuilder(
future: DatabaseService.getUserWithId(post.authorId),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return SizedBox.shrink();
}
User author = snapshot.data;
return PostView(
currentUserId: widget.currentUserId,
post: post,
author: author,
);
},
);
},
),
),
);
}
}

这就是我获取帖子列表的方式

static Future<List<Post>> getFeedPosts(String userId) async {
QuerySnapshot feedSnapshot = await feedsRef
.document(userId)
.collection('userFeed')
.orderBy('timestamp', descending: true)
.limit(30)
.getDocuments();
List<Post> posts =
feedSnapshot.documents.map((doc) => Post.fromDoc(doc)).toList();
return posts;
}

最佳答案

na2axl 的回答 几乎是正确的。我将在此处添加有关如何使用 startAfter()

的解释和示例

如果您检查 documentation on pagination ,您将看到您需要使用 startAfter() 来引用您使用的任何过滤器。在您的情况下,您使用 timestamp 进行订购,因此您的下一个查询应如下所示:

static Future<List<Post>> getNextFeedPosts(String userId, TimeStamp timestamp) async {
QuerySnapshot feedSnapshot = await feedsRef
.document(userId)
.collection('userFeed')
.orderBy('timestamp', descending: true)
//Here you need to let Firebase know which is the last document you fetched
//using its timesTamp
.startAfter(timestamp)
.limit(30)
.getDocuments();
List<Post> posts =
feedSnapshot.documents.map((doc) => Post.fromDoc(doc)).toList();
return posts;
}

这意味着您的下一个查询仍将按 时间戳 排序,但检索到的第一个文档将在 时间戳之后>开始之后

我希望这对您有所帮助,但是您可以查看文档,因为还有其他示例!

关于flutter - 如何将延迟加载添加到此列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61388465/

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