flutter - SliverList / SliverChildBuilderDelegate предоставляют начальный индекс или разрешают отрицательные индексы - PullRequest
0 голосов
/ 31 мая 2018

В настоящее время я создаю представление календаря во Flutter, используя SliverList и SliverChildBuilderDelegate, так что мне не нужно отображать каждый элемент в календаре сразу.

Первая дата - это время эпохи,1 января 1970 года, и последняя дата - это нечетное количество времени, вычисленное после сегодняшней даты.

Моя проблема в том, что когда я впервые отображаю представление, я хочу, чтобы оно отображало представление, начинающееся сегодня, а непо состоянию на 1 января 1970 года. Однако, если сегодня у меня индекс 0, отрицательные индексы не разрешаются (или не предоставляются) делегату компоновщика, поэтому вы не можете прокрутить с этой даты.Вы также не можете предоставить начальный индекс, насколько я могу судить, сборщику или списку, поэтому я также не могу сделать время эпохи индексом 0, так как список там только начинается, что приводит к довольно ужасным последствиям.опыт!Я не совсем уверен, как поступить.

У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 31 мая 2018

Я не знаю простой способ сделать это, нет параметра 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,
        ),
      ),
    ],
  );
}

В обоих случаях это результат, когда вы впервые открываете приложение.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...