颤振 - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引
Posted
技术标签:
【中文标题】颤振 - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引【英文标题】:flutter - SliverList / SliverChildBuilderDelegate supply initial index or allow negative indices 【发布时间】:2018-11-10 01:11:26 【问题描述】:我目前正在使用 SliverList 和 SliverChildBuilderDelegate 在 Flutter 中构建一个日历视图,这样我就不必一次渲染日历中的每个项目。
第一个日期是纪元时间,1970 年 1 月 1 日,最后一个日期是在今天日期之后计算的某个奇数时间。
我的问题是,当我第一次渲染视图时,我希望它从今天开始渲染视图,而不是在 1970 年 1 月 1 日。但是,如果我将今天作为 0 索引,则不允许负索引(或提供)给构建器委托,因此您无法从该日期向上滚动。据我所知,您也无法向构建器或列表提供初始索引,因此我也无法将纪元时间设为 0 索引,因为列表将从那里开始,这造成了相当可怕的后果经验!我不完全确定如何继续。
有人有什么建议吗?
【问题讨论】:
How to scroll item in ListView so it is visible?的可能重复 【参考方案1】:我不知道有什么简单的方法可以做到这一点,ListView
和 SliverList
中都没有 initialPositition
参数。我能想到的原因是列表是嵌入在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(),
);
或者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,
),
),
],
);
在这两种情况下,这都是您首次打开应用时的结果。
【讨论】:
是的,这就是我遇到的问题,因为虽然每个月/周标题都具有相同的高度,但日小部件本身的大小取决于它们拥有的项目数量。 但这仍然遵循良好的模式吗?如果一天小部件的高度是它所拥有的项目数量的函数,您仍然可以自己计算和缓存它(并在需要时更新),然后在构建时使用它。 啊,不用等,我明白了。我会玩弄它。谢谢!【参考方案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
【讨论】:
以上是关于颤振 - SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引的主要内容,如果未能解决你的问题,请参考以下文章
SliverList , SliverFixedExtentList
SliverList 和 Getx StateMixin 支持
Flutter-如何将标题添加到 SliverList 的 SliverChildBuilderDelegate?