我想知道如何在Flutter中使用CustomScrollView实现无限滚动。
在init上,我有一个加载项目的调用,它可以工作。但是,我想再次启动对provider的调用以重新加载,但我可以重新启动,因为我没有在onScroll函数中调用provider的上下文。
目前,我有以下内容:
class _FeedScreenState extends State<FeedScreen> {
final _scrollController = ScrollController();
double _prevScrollPos = 0.0;
_onScroll() {
double maxScroll = _scrollController.position.maxScrollExtent;
double currentScrollPos = _scrollController.position.pixels;
double delta = 200.0;
if (maxScroll - currentScrollPos <= delta && _prevScrollPos - currentScrollPos < 0) {
print('load... I would like to call my provider to load the others posts with addPost()');
//Provider.of<GlobalFeeds>(context, listen: false).addPost();
// to fix the unlimited call on onScroll function
_scrollController.jumpTo(_scrollController.position.pixels);
}
_prevScrollPos = currentScrollPos;
}
_addPost(context) {
Provider.of<GlobalFeeds>(context, listen: false).addPost();
}
@override
void initState() {
_scrollController.addListener(_onScroll);
Timer.run(() {
_addPost(context);
});
super.initState();
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final globalFeeds = Provider.of<GlobalFeeds>(context);
final posts = globalFeeds.posts;
return Scaffold(
body: CustomScrollView(
controller: _scrollController,
slivers: [
SliverAppBar(
...
),
SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
final Post post = posts[index];
return PostContainer(post: post);
},
childCount: posts.length,
),
),
],
)
);
}
}要初始化我的列表,我调用initState():
Timer.run(() {
_addPost(context);
});我不知道这是不是一个好的做法。你知道我如何实现这个功能吗,在onScroll函数中有一个上下文,或者有一个更好的解决方案?
发布于 2021-06-08 10:48:27
尝试使用
itemBuilder: (index, context) {
if(items.length < index) {
return items[index-1];
}
else {
return FutureBuilder(/*...*/); // your loading widget which
} // becomes the new item once loaded
}还可以去掉childCount。
https://stackoverflow.com/questions/67878570
复制相似问题