我目前正在使用SliverList和SliverChildBuilderDelegate在Flutter中构建日历视图,这样我就不必一次渲染日历中的每个项目。
第一个日期是纪元时间,即1970年1月1日,最后一个日期是今天的日期之后计算出的奇数时间。
我的问题是,当我第一次渲染视图时,我希望它从今天开始而不是从1970年1月1日开始渲染视图。但是,如果我今天使用0索引,则不允许(或提供)负索引到构建者委托,因此您无法从该日期开始向上滚动。据我所知,您也无法向构建器或列表提供初始索引,因此我也无法将时间作为0索引,因为列表只是从此处开始,这非常糟糕经验!我不确定如何进行。
有人有什么建议吗?
我不知道执行此操作的简便方法,initialPosititionin ListView和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(),
);
}
Run Code Online (Sandbox Code Playgroud)
或在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,
),
),
],
);
}
Run Code Online (Sandbox Code Playgroud)
在两种情况下,这都是您首次打开应用程序时的结果。

| 归档时间: |
|
| 查看次数: |
6579 次 |
| 最近记录: |