Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振-SliverList/SliverChildBuilderDelegate供应初始指数或允许负指数_Flutter_Dart_Flutter Layout_Flutter Sliver_Flutter Widget - Fatal编程技术网

Flutter 颤振-SliverList/SliverChildBuilderDelegate供应初始指数或允许负指数

Flutter 颤振-SliverList/SliverChildBuilderDelegate供应初始指数或允许负指数,flutter,dart,flutter-layout,flutter-sliver,flutter-widget,Flutter,Dart,Flutter Layout,Flutter Sliver,Flutter Widget,我目前正在使用SliverList和SliverChildBuilderDelegate在Flatter中构建一个日历视图,这样我就不必一次渲染日历中的每个项目 第一个日期是大纪元时间,1970年1月1日,最后一个日期是在今天日期之后计算的一些奇数时间 我的问题是,当我第一次渲染视图时,我希望它从今天开始渲染视图,而不是从1970年1月1日开始。但是,如果我将今天作为0索引,则不允许(或提供)生成器委托使用负索引,因此您不能从该日期开始向上滚动。据我所知,您也不能向构建器或列表提供初始索引,因此

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

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

我的问题是,当我第一次渲染视图时,我希望它从今天开始渲染视图,而不是从1970年1月1日开始。但是,如果我将今天作为0索引,则不允许(或提供)生成器委托使用负索引,因此您不能从该日期开始向上滚动。据我所知,您也不能向构建器或列表提供初始索引,因此我也不能将epoch time作为0索引,因为列表将从那里开始,这将带来非常糟糕的体验!我不完全确定如何进行


有人有什么建议吗?

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

默认情况下,这两个列表小部件对其项的高度不做任何假设,因此,一般来说,要找到偏移量,需要逐个计算之前所有小部件的高度,这是低效的

但是,如果事先知道所有列表项的高度,或者可以通过
ListView.itemExtent
字段或
SliverFixedExtentList
强制将其设置为固定高度,则可以简化操作

@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,
        ),
      ),
    ],
  );
}

如果事先确实知道(或强制)列表项的高度,可以通过
ScrollController
中的
initialScrollOffset
设置初始项。下面是一个带有
列表视图的示例

@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(),
  );
}
或者在
滑动列表中

@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,
        ),
      ),
    ],
  );
}
在这两种情况下,这都是您第一次打开应用程序时的结果


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,
  ),
);


参考资料:

是的,这就是我的问题所在,因为虽然每个月/周的标题都有相同的高度,但日期小部件本身有不同的大小,这取决于它们有多少个项目。但这是否仍然遵循良好的模式?如果一天的高度小部件是它拥有的项目数的函数,你仍然可以自己计算和缓存它(并在需要时更新),然后在构建时使用它。啊,不,等等,我明白了。我来玩玩它。非常感谢。可能重复的