11

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

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

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

有没有人有什么建议?

4

2 回答 2

16

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

默认情况下,这两个列表小部件不假设其项目的高度,因此通常要找到偏移量需要您一个一个地计算它之前的所有小部件的高度,这是低效的。

但是,如果您事先知道所有列表项的高度,或者可以通过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(),
  );
}

或者在一个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,
        ),
      ),
    ],
  );
}

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

在此处输入图像描述

于 2018-05-31T09:05:22.047 回答
2

SliverList 接受一个委托参数,当它们滚动到视图中时,它提供列表中的项目。

您可以使用 SliverChildListDelegate 指定实际的子级列表,或者使用 SliverChildBuilderDelegate 懒惰地构建它们。

SliverList(
    delegate: SliverChildListDelegate(
      [
        Container(color: Colors.red, height: 150.0),
        Container(color: Colors.purple, height: 150.0),
        Container(color: Colors.green, height: 150.0),
      ],
    ),
);
// This builds an infinite scrollable list of differently colored 
// Containers.
SliverList(
    delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
      // To convert this infinite list to a list with three items,
      // uncomment the following line:
      // if (index > 3) return null;
      return Container(color: getRandomColor(), height: 150.0);
    },
    // Or, uncomment the following line:
    // childCount: 3,
  ),
);

在此处输入图像描述

参考资料: http: //flutterexamples.com/#textfield

于 2020-12-09T02:46:07.037 回答