如何在flutter中获取滚动的ListView索引号?

问题描述

我在Flutter应用程序中为listview构建器使用以下代码,我需要在滚动时获取列表中项目的索引。使用onPageChanged:(){}时就像PageView.Builder功能

return ListView.builder(
              itemCount: posts.length,itemBuilder: (context,index) {
                final item = posts[index];
                return Post(index: index,title: 'Test',imageUrl: 'https://www.google.com',);
              },);

我该怎么办?

解决方法

没有这么简单的方法,但是您可以使用visibility_detector包中的VisibilityDetector

通过用VisibilityDetector包装每个列表项,可以获得在屏幕上完全可见的最后一个列表项的索引。

itemBuilder: (context,index) {
  return VisibilityDetector(
    key: Key(index.toString()),onVisibilityChanged: (VisibilityInfo info) {
      if (info.visibleFraction == 1)
        setState(() {
          _currentItem = index;
          print(_currentItem);
        });
    },child: Post(index: index,title: 'Test',imageUrl: 'https://www.google.com',)
  );
},

_currentItem是处于主窗口小部件状态的变量,用于存储最后一个可见项目的索引:

int _currentItem = 0;

注意:这是基于滚动方向的,即最后一个可见项目的索引等于在滚动后可见的最后一个项目的索引;如果滚动方向是正向,则为项目在屏幕底部的索引;如果滚动方向为反向,则为项目在屏幕顶部的索引。不过,可以轻松更改此逻辑(例如,使用队列存储可见的全部项目)。