我目前正在使用SliverList和SliverChildBuilderDelegate在Flutter中构建日历视图,这样我就不必一次渲染日历中的每个项目。
第一个日期是纪元时间,1970年1月1日,最后一个日期是在今天的日期之后计算的奇数时间。
我的问题是,当我第一次渲染视图时,我希望它从今天开始渲染视图,而不是1970年1月1日。但是,如果我今天有0索引,则不允许使用负数索引(或者提供给构建者代表,因此您无法从该日期向上滚动。就我所知,你也无法向构建器或列表提供初始索引,因此我不能将纪元时间作为0索引,因为列表将从那里开始,这使得非常可怕经验!我不完全确定如何继续。
有人有任何建议吗?
答案 0 :(得分:1)
我不知道一种简单的方法,initialPositition
和ListView
中没有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(),
);
}
或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,
),
),
],
);
}
在这两种情况下,这都是您首次打开应用时的结果。
答案 1 :(得分:-1)
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,
),
);