【问题标题】:Infinite scroll with CustomScrollView Flutter使用 CustomScrollView Flutter 无限滚动
【发布时间】:2021-08-24 22:45:15
【问题描述】:

我想知道如何在 Flutter 中使用 CustomScrollView 实现无限滚动。

在初始化时,我可以调用加载项目,它可以工作。但是,我想再次启动对提供程序的调用以再次重新加载,但我可以重新启动,因为我没有在 onScroll 函数中调用提供程序的上下文。

目前,我有这个:

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 函数中有一个上下文或者有一个更好的解决方案吗?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    尝试使用

      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

    【讨论】:

      猜你喜欢
      • 2022-12-28
      • 1970-01-01
      • 2021-11-15
      • 2023-04-05
      • 2021-11-07
      • 2019-11-20
      • 2018-12-21
      • 1970-01-01
      • 2020-04-25
      相关资源
      最近更新 更多