Я работаю над книжным приложением, используя флаттер. Я показываю страницы книги, используя просмотр страниц для каждой главы. Проблема в том, что когда пользователь проводит пальцем влево на последней странице, я должен загрузить следующую главу из базы данных вместе с заголовком главы. Наоборот, проведите пальцем вправо на первой странице для предыдущей главы. Итак, как я могу найти этого пользователя на первой или последней странице и провести пальцем влево или вправо?
и вы проверяли RefreshIndicator источники? если да, то заметили ли вы, как он обнаруживает превышение прокрутки?
RefreshIndicator с помощью NotificationListener<OverscrollIndicatorNotification>. Я использую SingleChildScrollView внутри просмотра страницы. Таким образом, в любом направлении я получаю уведомление без информации о направлении. Если я использую NotificationListener<OverscrollIndicatorNotification>.
тогда попробуй другие уведомления
Вы можете проверить, является ли она последней на первой странице, сравнив методы 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?
Вы действительно хотите загружать следующие страницы после того, как пользователь попытался прокрутить, но контента не было? Используя приведенный выше ответ, вы загрузите следующий раздел страниц, когда пользователь попадет на последнюю страницу, что сделает прокрутку плавной. onPageChanged не срабатывает в начальном состоянии, поэтому вы не загрузите предыдущую главу при запуске. В каком направлении вы проводите пальцем, (если я неправильно истолковал ваш вопрос) не имеет значения. Вы всегда хотите загружать следующий набор страниц, когда пользователь достигает конца в любом направлении.
Если пользователь проводит пальцем влево на последней странице? вместо перехода к следующей главе?
Затем он вернется на предыдущую страницу, но будет загружен следующий набор страниц. Если вы действительно не хотите загружать страницы до того, как пользователь попытается перейти на несуществующую страницу, вы можете добавить прослушиватель в PageViewController и запустить там свою логику. Другой подход может состоять в том, чтобы обернуть PageView в виджет GestureRecognition. Я обновлю свой ответ, чтобы улучшить инструменты форматирования, чтобы показать вам, что я имею в виду.
Если я добавлю GestureDetector для просмотра страницы, GestureDetector вызывается только для первой страницы. Если я добавлю GestureDetector для каждой страницы внутри просмотра страницы, GestureDetector вызывается, но просмотр страницы не прокручивается.
GestureDetector не получает никаких событий горизонтального перетаскивания для меня. Только onHorizontalDragCancel и onHorizontalDragDown стреляют.
Я решил это с помощью 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(
....
)
));
Не могли бы вы добавить некоторые комментарии к коду, объясняющие, что представляет собой каждая строка, и/или удалить собственную логику с категориями и подкатегориями. Это помогло бы другим.
Для моего варианта использования это гораздо лучшее решение, чем комбинация GestureDetector и PageView с NeverScrollableScrollPhysics, поскольку эта комбинация также меняет ощущение прокрутки. С вашим решением я могу легко обнаружить попытки прокрутки на первой и последней странице и сохранить исходное ощущение!
В конце концов я решил использовать OverscrollNotification вместо OverscrollIndicatorNotification, так как я могу получить количество избыточной прокрутки в <OverscrollNotification>.overscroll. Таким образом, я могу реагировать только на значительную величину прокрутки и игнорировать случайное событие перетаскивания конечного пользователя.
посмотрите, как
RefreshIndicatorобнаруживает превышение границ (или даже использует его напрямую?)