Flutter - SliverList/SliverChildBuilderDelegate如何提供初始索引或允许负数索引。

11
我目前正在使用SliverList和SliverChildBuilderDelegate在Flutter中构建一个日历视图,这样我就不必一次性渲染日历中的每个项目。
第一个日期是纪元时间,即1970年1月1日,最后一个日期是今天日期之后计算出来的奇怪时间量。
我的问题是,当我首次呈现视图时,我希望从今天开始呈现视图,而不是从1970年1月1日开始。然而,如果我将今天设为0索引,由于生成器委托不允许(或提供)负索引,因此无法从该日期向上滚动。据我所知,您也无法向生成器或列表提供初始索引,因此我也无法将纪元时间作为0索引,因为列表将从那里开始,这会导致非常糟糕的体验!我不太确定该如何继续。
有人有什么建议吗?

可能是如何滚动ListView中的项目使其可见?的重复问题。 - creativecreatorormaybenot
1个回答

18

我不知道有什么简单的方法可以做到这一点,在ListViewSliverList中都没有initialPositition参数。我能想到的原因是列表是一系列嵌入在ScrollView上的小部件,因此为了设置初始项目,您需要知道该项目的确切滚动偏移量。

默认情况下,这两个列表小部件对其项目的高度没有任何假设,因此通常需要逐个计算其前面所有小部件的高度来找到该偏移量,这是低效的。

但是,如果您事先知道所有列表项的高度,或者通过ListView.itemExtent字段或SliverFixedExtentList强制它们具有固定的高度,则可以简化事情。


如果您确实已经知道(或强制)您的列表项的高度,则可以通过ScrollController中的initialScrollOffset设置初始项目。以下是一个使用ListView的示例。

@override
Widget build(BuildContext context) {
  final _itemExtent = 56.0; // I know item heights beforehand
  final generatedList = List.generate(500, (index) => 'Item $index');

  return ListView(
    controller: ScrollController(initialScrollOffset: _itemExtent * 401),
    children: generatedList
        .map((index) =>
            ListTile(title: Text(index, style: TextStyle(fontSize: 20.0))))
        .toList(),
  );
}

或者在SliverList中。

@override
Widget build(BuildContext context) {
  final _itemExtent = 56.0;
  final generatedList = List.generate(500, (index) => 'Item $index');

  return CustomScrollView(
    controller: ScrollController(initialScrollOffset: _itemExtent * 401),
    slivers: [
      SliverFixedExtentList(
        itemExtent: _itemExtent,  // I'm forcing item heights
        delegate: SliverChildBuilderDelegate(
          (context, index) => ListTile(
                title: Text(
                  generatedList[index],
                  style: TextStyle(fontSize: 20.0),
                ),
              ),
          childCount: generatedList.length,
        ),
      ),
    ],
  );
}

在这两种情况下,这是您首次打开该应用程序时的结果。

enter image description here


是的,这就是我的问题,因为每个月/周标题都具有相同的高度,而日期小部件本身的大小取决于它们包含的项目数量。 - Sam Markoe
但这是否仍然遵循良好的模式呢?如果日部件的高度是其项目数量的函数,您仍然可以自己计算和缓存它(并在需要时更新),然后在构建时使用它。 - Edman
啊,等等,我明白了。我会试着调整它的。谢谢! - Sam Markoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接