Обновление счетчика Flutter GridView дает неправильную позицию прокрутки - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок во Flutter и пытаюсь реализовать список сетки.

Я использовал GridView для этого.

Я хочу, чтобы мои GridView отображали 2 элемента в каждой строкепо умолчанию

и когда пользователь нажимает кнопку на AppBar,

, я хочу изменить счетчик моего GridView

, чтобы он мог отображать только одинэлемент в строке.

Для реализации этого поведения

Я создал MyApp, _GridCountButton, MainList.

MyApp, что StatefulWidget, чтоудерживает _gridCount.

_GridCountButton является StatelessWidget и принимает слушателя от MyApp и вызывает слушателя при его нажатии.

MainList - это тот, который содержит GridView.

count: 2 count: 1

Как видите, смена сетки работает,

нопозиция прокрутки GridView не то, что я хотел.

Кажется, что она поддерживает абсолютное значение прокрутки.

Что я могу сделать, чтобы сохранить первый элемент на экранебыть таким же?

1 Ответ

0 голосов
/ 19 декабря 2018

Я примерно решил свою проблему, поэтому это решение может не сработать в других случаях.

Лучшее решение может быть

Лучшим решением может быть использование ScrollControllerпрослушивать и переходить к определенному смещению, вычисленному с height элементов.

Чтобы получить height элемента, я нашел способ сделать это в обратном вызове initState(), но я сделал свойСписок StatelessWidget, поэтому он не имеет initState().

Что я сделал

Мой случай

Так что я просто использовал соотношениеразмер элементов, чтобы получить правильное смещение.

В моем случае я должен был показать 1 или 2 элемента в строке, grid1 и grid2 соответственно.

Так что я сохранилсмещение от grid1 и grid2 до offset и offset2.

Тогда соотношение между offset1 и offset2 будет offset1 = offset2*4, поскольку grid1 может отображать только 1элемент, когда grid2 может показывать 4 элемента с одинаковым пробелом.

Почему бы не просто offset?

Я попытался использовать только одну переменную offset, хранящуюсмещение grid1.

Когда вызывается событие прокрутки, я рассчитал offset, чтобы всегда держать смещение grid1.

Однако событие прокрутки не вызывается, когда нет прокруток.

Поэтому, когда я

  1. переключаюсь с grid1 на grid2,
  2. не выполняю прокрутку,
  3. переключается с grid2 на grid1,

значение offset остается неизменным и распознается как смещение grid2.

Поэтому я разделил offset1 и offset2, чтобы сделатьуверен, какое смещение соответствует какой сетке.

С offset1 и offset2

Теперь, когда у меня есть правильные значения, которые обновляются правильно, я теперь могу установить это значениечтобы установить правильное смещение.

Когда я вызываю setState для переключения сетки, я добавил следующие строки.

setState(() {
  double offset = 0.0; // offset to be set
  if(_gridCount == 2) {
    _gridCount = 1;
    offset = offset1; // set offset1
  } else {
    _gridCount = 2;
    offset = offset2; // set offset2
  }
  _scrollController.jumpTo(offset); // set proper offset
});

И это сработало!

...