在 Flutter ListView 中,我如何知道视图中第一个和最后一个项目的索引号?

In a Flutter ListView, how do I know the index number of the first and last items in view?

给定一个按一定偏移量滚动的 ListView,我如何知道当前视图中的第一个和最后一个项目的索引号?

我试过这个:

class MySliverChildBuilderDelegate extends SliverChildBuilderDelegate {
  MySliverChildBuilderDelegate(IndexedWidgetBuilder builder, {int childCount})
      : super(builder, childCount: childCount);

  @override
  void didFinishLayout(int firstIndex, int lastIndex) {
    print("firstIndex = $firstIndex / lastIndex = $lastIndex");
  }
}

然后:

SliverChildBuilderDelegate childrenDelegate =
    MySliverChildBuilderDelegate(itemBuilder, childCount: childCount);

ListView.custom(
    controller: _controller,
    childrenDelegate: childrenDelegate));

但是那些 firstIndex 和 lastIndex 实际上并不是我想象的那样...

此信息不可用。

最多能得到RenderSliverListListView的下一层)已经布置的索引。

这相当于可见的东西 + 周围的潜在额外物。

截至 2020 年,我想这个问题的答案是使用 ScrollablePositionedList (https://pub.dev/packages/scrollable_positioned_list) 而不是 ListView.

然后您可以监控哪些项目在屏幕上可见:

itemPositionsListener.positions.addListener((positions) => ...);