flutter - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引

2024-05-11

我目前正在 Flutter 中使用 SliverList 和 SliverChildBuilderDelegate 构建日历视图,这样我就不必一次渲染日历中的每个项目。

第一个日期是纪元时间,即 1970 年 1 月 1 日,最后一个日期是在今天的日期之后计算的一些奇数时间。

我的问题是,当我第一次渲染视图时,我希望它从今天开始渲染视图,而不是从 1970 年 1 月 1 日开始。但是,如果我将今天作为 0 索引,则不允许(或提供)负索引构建器委托,因此您无法从该日期开始向上滚动。据我所知,您也无法向构建器或列表提供初始索引,因此我也无法将纪元时间设置为 0 索引,因为列表只是从那里开始,这导致了非常可怕的情况经验!我不完全确定如何继续。

有没有人有什么建议?


我不知道有什么简单的方法可以做到这一点,没有initialPositition参数输入ListView nor in SliverList。我能想到的原因是列表是嵌入在ScrollView,这样为了设置初始项目,您需要知道该项目的确切滚动偏移量。

默认情况下,两个列表小部件不会对其项目的高度进行假设,因此一般来说,查找偏移量需要您一一计算其之前的所有小部件的高度,这是低效的。

但是,如果您事先知道所有列表项的高度,或者可以通过以下任一方式强制它们具有固定高度,则可以使事情变得更容易ListView.itemExtent场或SliverFixedExtentList.


如果您事先知道(或强制)列表项的高度,您可以通过initialScrollOffset在你的ScrollController。这是一个例子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(),
  );
}

Or in a 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,
        ),
      ),
    ],
  );
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引 的相关文章

随机推荐