Я не знаю простой способ сделать это, нет параметра 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,
),
),
],
);
}
В обоих случаях это результат, когда вы впервые открываете приложение.