Просмотр страницы Flutter: поиск первой и последней страницы и пролистывание направлений

Я работаю над книжным приложением, используя флаттер. Я показываю страницы книги, используя просмотр страниц для каждой главы. Проблема в том, что когда пользователь проводит пальцем влево на последней странице, я должен загрузить следующую главу из базы данных вместе с заголовком главы. Наоборот, проведите пальцем вправо на первой странице для предыдущей главы. Итак, как я могу найти этого пользователя на первой или последней странице и провести пальцем влево или вправо?

посмотрите, как RefreshIndicator обнаруживает превышение границ (или даже использует его напрямую?)

pskink 19.03.2019 10:47

и вы проверяли RefreshIndicator источники? если да, то заметили ли вы, как он обнаруживает превышение прокрутки?

pskink 20.03.2019 07:01

RefreshIndicator с помощью NotificationListener<OverscrollIndicatorNotification>. Я использую SingleChildScrollView внутри просмотра страницы. Таким образом, в любом направлении я получаю уведомление без информации о направлении. Если я использую NotificationListener<OverscrollIndicatorNotification>.

Srini2k6 27.03.2019 17:23

тогда попробуй другие уведомления

pskink 27.03.2019 17:49
6
4
5 307
2

Ответы 2

Вы можете проверить, является ли она последней на первой странице, сравнив методы onPageChangedindex с вашими collection.length, например:

PageView(
  onPageChanged: (index) {
    if (index + 1 == myCollection.length) {
      loadNextChapter();
    } else if (index == 0) {
      loadPreviousChapter();
    }
  },
);

Редактировать 1:

Использование GestureDetector:

PageView mPageView = PageView(
  onPageChanged: (index) {
    if (index + 1 == myCollection.length) {
      hasReachedEnd = true;
    } else if (index == 0) {
      hasReachedFirst = true
    } else {
      hasReachedFirst = false
      hasReachedEnd = false
    }
  },
);

GestureDetector mGestureDetector = GestureDetector(
  child: mPageView
  onHorizontalDragEnd: (dragEndDetails) {
    if (dragEndDetails.primaryVelocity < 0 && hasReachedStart) {
      loadPreviousChapter(); //if you want to go to the next page once fetched you can do so by adding .then()
    } else if (dragEndDetails.primaryVelocity > 0 && hasReachedEnd) {
      loadNextChapter();
    }
  }
);

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

Всякий раз, когда мы прокручиваем новую страницу, мы проверяем, находимся ли мы в конце или в начале элементов.

Комбинируя их, вы получите желаемый эффект.

Спасибо. Но как узнать, что пользователь проводит пальцем влево или вправо, когда индекс равен 0?

Srini2k6 19.03.2019 02:34

Вы действительно хотите загружать следующие страницы после того, как пользователь попытался прокрутить, но контента не было? Используя приведенный выше ответ, вы загрузите следующий раздел страниц, когда пользователь попадет на последнюю страницу, что сделает прокрутку плавной. onPageChanged не срабатывает в начальном состоянии, поэтому вы не загрузите предыдущую главу при запуске. В каком направлении вы проводите пальцем, (если я неправильно истолковал ваш вопрос) не имеет значения. Вы всегда хотите загружать следующий набор страниц, когда пользователь достигает конца в любом направлении.

Joel Broström 19.03.2019 10:28

Если пользователь проводит пальцем влево на последней странице? вместо перехода к следующей главе?

Srini2k6 19.03.2019 11:24

Затем он вернется на предыдущую страницу, но будет загружен следующий набор страниц. Если вы действительно не хотите загружать страницы до того, как пользователь попытается перейти на несуществующую страницу, вы можете добавить прослушиватель в PageViewController и запустить там свою логику. Другой подход может состоять в том, чтобы обернуть PageView в виджет GestureRecognition. Я обновлю свой ответ, чтобы улучшить инструменты форматирования, чтобы показать вам, что я имею в виду.

Joel Broström 19.03.2019 11:40

Если я добавлю GestureDetector для просмотра страницы, GestureDetector вызывается только для первой страницы. Если я добавлю GestureDetector для каждой страницы внутри просмотра страницы, GestureDetector вызывается, но просмотр страницы не прокручивается.

Srini2k6 26.03.2019 17:04

GestureDetector не получает никаких событий горизонтального перетаскивания для меня. Только onHorizontalDragCancel и onHorizontalDragDown стреляют.

Phani Rithvij 18.12.2019 17:14

Я решил это с помощью OverscrollIndicatorNotification. С главами и подглавами.

    return new Container(
    child: NotificationListener<OverscrollIndicatorNotification>(
        onNotification: ((notification) {
          print(notification.toString());
          if (notification is OverscrollIndicatorNotification) {
            if (notification.depth == 0 ||_listOfCat.indexOf(_category)==0) {
              int index = _listOfSubCat.indexOf(_subCategory);
              if (notification.leading) {
                if (index != 0) {
                  setSubCatId(_listOfSubCat[index - 1]);
                } else {
                  index = _listOfCat.indexOf(_category);
                  if (index != 0) {
                    setCatId(_listOfCat[index - 1]);
                  }
                }
              } else {
                if (index != _listOfSubCat.length - 1) {
                  setSubCatId(_listOfSubCat[index + 1]);
                } else {
                  index = _listOfCat.indexOf(_category);
                  if (index != _listOfCat.length - 1) {
                    setCatId(_listOfCat[index + 1]);
                  }
                }
              }
            }
          }
          return true;
        }),
        child: _pageView=PageView(
          ....
        )
    ));

Не могли бы вы добавить некоторые комментарии к коду, объясняющие, что представляет собой каждая строка, и/или удалить собственную логику с категориями и подкатегориями. Это помогло бы другим.

Phani Rithvij 18.12.2019 16:26

Для моего варианта использования это гораздо лучшее решение, чем комбинация GestureDetector и PageView с NeverScrollableScrollPhysics, поскольку эта комбинация также меняет ощущение прокрутки. С вашим решением я могу легко обнаружить попытки прокрутки на первой и последней странице и сохранить исходное ощущение!

DamirR 02.01.2022 21:09

В конце концов я решил использовать OverscrollNotification вместо OverscrollIndicatorNotification, так как я могу получить количество избыточной прокрутки в <OverscrollNotification>.overscroll. Таким образом, я могу реагировать только на значительную величину прокрутки и игнорировать случайное событие перетаскивания конечного пользователя.

DamirR 02.01.2022 21:49

Другие вопросы по теме