Flutter - PageView - прокрутка только тогда, когда вы проводите пальцем по определенному компоненту c вместо любого места на странице - PullRequest
0 голосов
/ 21 июня 2020

Совершенно новый для флаттера, менее 10 часов на нем.

У меня есть PageView, обрабатывающий 3 страницы, он отлично прокручивает их по горизонтали.

Но я бы хотел изменить "разрешено" проведите пальцем по области. Я не хочу позволять пользователю изменять страницы, прокручиваемые с любой позиции страницы, но вместо этого, например, просто позволяю ему прокручивать страницы, если он, например, проводит по компоненту AppBar.

Я видел у PageView есть метод applyTo, я просто не знаю, как дать ему идентификатор (ключи) или appBar, чтобы посмотреть, сработает ли это.

Есть ли способ добиться этого «только прокрутите, если пользователь проводит по компоненту X "?

Изменить 1

Решение, предложенное Альберто Миола , работает как шарм, вот мой код (мне пришлось реализовать из PreferredSizeWidget поскольку требуется для изменения AppBar).

class GestureDetectorForAppBar extends StatelessWidget implements PreferredSizeWidget {
  final double height;
  final AppBar appbar;
  final GestureDragUpdateCallback onPanUpdate;

  GestureDetectorForAppBar({
    Key key,
    this.appbar,
    this.onPanUpdate,
    @required this.height,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(child: this.appbar, onPanUpdate: this.onPanUpdate,);
  }

  @override
  Size get preferredSize => Size.fromHeight(height);
}

1 Ответ

2 голосов
/ 21 июня 2020

Прежде всего, вам нужно «заблокировать» жест смахивания на самом PageView, используя NeverScrollableScrollPhysics :

PageView(
  physics: const NeverScrollableScrollPhysics(),
  children: [...],
  controller: ...
);

Обратите внимание на использование конструктора const. Таким образом, вы не сможете перемещаться по страницам пальцем. Во Flutter у вас есть виджеты , а не компоненты .

Взгляните на виджет GestureDetector , который можно использовать для прослушивания свайпов и изменения текущего видимого содержимого вашего PageView. Его можно использовать для обнаружения свайпов:

GestureDetector(
  onPanUpdate: (data) {
    if (data.delta.dx > 0) {
      // right swipe
    } 

    if (data.delta.dx < 0) {
      // right swipe
    }
  }
);

По порядку, предлагаю сначала прочитать про NeverScrollableScrollPhysics() в официальной документации. Он используется для «блокировки» прокрутки. Затем используйте GestureDetector(), чтобы обернуть виджет, который вы хотите использовать как «директор прокрутки» (тот, который фактически прокручивает страницы).

Внутри onPanUpdate вы будете иметь дело с animateToPage метод PageController для изменения текущей видимой страницы.

...