我不知道有什么简单的方法可以做到这一点,在ListView
或SliverList
中都没有initialPositition
参数。我能想到的原因是列表是一系列嵌入在ScrollView
上的小部件,因此为了设置初始项目,您需要知道该项目的确切滚动偏移量。
默认情况下,这两个列表小部件对其项目的高度没有任何假设,因此通常需要逐个计算其前面所有小部件的高度来找到该偏移量,这是低效的。
但是,如果您事先知道所有列表项的高度,或者通过ListView.itemExtent
字段或SliverFixedExtentList
强制它们具有固定的高度,则可以简化事情。
如果您确实已经知道(或强制)您的列表项的高度,则可以通过ScrollController
中的initialScrollOffset
设置初始项目。以下是一个使用ListView
的示例。
@override
Widget build(BuildContext context) {
final _itemExtent = 56.0;
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,
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(
title: Text(
generatedList[index],
style: TextStyle(fontSize: 20.0),
),
),
childCount: generatedList.length,
),
),
],
);
}
在这两种情况下,这是您首次打开该应用程序时的结果。