Просмотр страницы Анимация страницы при прокрутке мыши событие в Flutter web

#flutter #flutter-web

Вопрос:

Я попытался использовать jumpToPage для события прокрутки мыши, и мне это удалось. Но теперь есть 2 проблемы. Страница jumpToPage слишком быстрая, и я хотел бы сделать ее немного медленнее, вторая проблема в том, что есть белый фон (который не загружается в браузере, и последняя страница возвращается на свое место).

Для первой проблемы я попытался использовать animateToPage, но безуспешно. И для второй проблемы я использовал условие if, чтобы индекс не превышал количество страниц, также без какого-либо успеха.

Вот мой код:

     Listener(
      onPointerSignal: (pointerSignal) {
        if (pointerSignal is PointerScrollEvent) {
          if (pointerSignal.scrollDelta.dy > 0) {
            if(_index < 4) {
              int newIndex = _index   1;
              pageController.jumpToPage(newIndex);
              // pageController.animateToPage(
              //   newIndex, duration: Duration(milliseconds: 500), curve: Curves.easeIn
              // );
              print(newIndex);
            }
          } 
          else 
          {
            // pageController.jumpToPage(_index - 1);
          }
        }
      },
      child: PageView(
        controller: pageController,
        scrollDirection: Axis.vertical,
        pageSnapping: true,
        onPageChanged: (index) {
          _index = index;
        },
        children: [
          Container(
            color: Colors.red,
          ),
          Container(
            color: Colors.blue,
          ),
          Container(
            color: Colors.green,
          )
        ]
      ),
    )
 

Вы можете видеть здесь, что я использовал animateToPage и хэшировал его. И я также хэшировал jumpToPage в заявлении else для целей тестирования.

Итак, мой вопрос в том, как решить 2 проблемы, о которых я упоминал?

Заранее спасибо…

Ответ №1:

Я думаю, что ваша проблема связана с тем, как вы используете свою _index переменную. Поскольку вы меняете значение _index как в вашем onPointerSignal , так и в вашем onPageChanged , оба значения могут конфликтовать.

Вот как я пытался реализовать ваш код:

 class MyWidget extends StatefulWidget {
  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  int _index = 0;
  final pageController = PageController();
  final _animationDuration = Duration(milliseconds: 500);
  final _curve = Curves.easeIn;

  @override
  Widget build(BuildContext context) {
    return Listener(
      onPointerSignal: (pointerSignal) {
        if (pointerSignal is PointerScrollEvent) {
          if (pointerSignal.scrollDelta.dy > 0) {
            pageController.nextPage(
                curve: _curve, duration: _animationDuration);
          } else {
            pageController.previousPage(
                duration: _animationDuration, curve: _curve);
          }
        }
      },
      child: PageView(
          physics: NeverScrollableScrollPhysics(),
          controller: pageController,
          scrollDirection: Axis.vertical,
          pageSnapping: true,
          onPageChanged: (index) {
            _index = index;
          },
          children: [
            Container(color: Colors.red),
            Container(color: Colors.blue),
            Container(color: Colors.green)
          ]),
    );
  }
}
 

Протестируйте полный код на DartPad

В принципе, я не завишу от _index переменной и вместо этого использую методы nextPage и previousPage для управления индексацией просмотров страниц.

Комментарии:

1. Спасибо, что ответили.. Я попробовал ваше решение, следующая страница действительно появляется, но для этого требуется несколько прокруток мыши, и она дрожит при первых нескольких прокрутках.. Есть ли способ использовать animateToPage и сделать его плавным? Еще раз спасибо…

2. Только что исправлен мой пример кода, проблема заключалась в том , что жест по умолчанию из просмотра страниц перекрывался с Listener жестом, который влияет на прокрутку с помощью прокрутки мыши, но не с помощью трекпада. Я исправил это, добавив NeverScrollableScrollPhysics в PageView . При этом он работает так, как задумано, с помощью прокрутки мыши.