Егор Долгов
Егор Долгов
(обновлено )
За все время: 1446 просмотров, 729 посетителей.
За последние 30 дней: 22 просмотра, 20 посетителей.

PageView свайп в одну сторону

По умолчанию виджет PageView прокручивается с помощью касания в обе стороны.

Чтобы запретить прокрутку с помощью касания, нужно в параметре physics задать значение NeverScrollableScrollPhysics().

И тогда чтобы переходить от страницы к странице нужен объект PageController, заданный в параметре controller.

Для перехода к другой странице нужно вызвать метод _pageController.jumpToPage()

Для анимированного перехода нужно использовать _pageController.animateToPage()

Односторонняя прокрутка

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

С помощью метода addListener зарегистрируем обработчик событий для объекта класса PageController.

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

Т.к. NeverScrollableScrollPhysics() блокирует все пользовательские жесты, мы не будем его использовать, а блокировать свайп вперед будем в обработчике событий.

Код обработчика односторонней прокрутки

Что происходит в обработчике для односторонней прокрутки

indexPage - в этой переменной должен быть номер страницы, которую должен видеть пользователь.

  1. Если пользователь делает свайп для прокрутки вперед
  2. И если текущая позиция меньше той к которой может привести свайп вперед
  3. Делаем переход без анимации к установленной странице, чтобы прервать и отменить свайп вперед
  4. Если пользователь выполняет свайп назад
  5. И если текущее состояние положения прокрутки равно целому значения
  6. Изменяем номер страницы которая должна быть открыта

Функция бизнес логики для смены страницы

Метод onPageChanged в PageView

В виджете PageView можно задать метод onPageChanged

В данном примере не рекомендуем его использовать, и выполнять все проверки и смену состояния в одном месте: _pageController.addListener((){}).

Подборка заметок