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