ScrollController, как я могу определить начало, остановку и прокрутку прокрутки?
Я использую ScrollController для SingleChildScrollView
виджет, где я хочу обнаружить, когда прокрутка начала, конца / остановки и все еще прокрутки?
Как я могу обнаружить, я использую Listene
scrollController = ScrollController()
..addListener(() {
scrollOffset = _scrollController.offset;
});
Также попробуйте с _scrollController.position.activity.velocity
но не помог мне
Также есть
_scrollController.position.didEndScroll();
_scrollController.position.didStartScroll();
Но как я могу это использовать?
6 ответов
По этой ссылке https://medium.com/@diegoveloper/flutter-lets-know-the-scrollcontroller-and-scrollnotification-652b2685a4ac
Просто оберните SingleChildScrollView
в NotificationListener
и обновите свой код как..
NotificationListener<ScrollNotification>(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollStartNotification) {
_onStartScroll(scrollNotification.metrics);
} else if (scrollNotification is ScrollUpdateNotification) {
_onUpdateScroll(scrollNotification.metrics);
} else if (scrollNotification is ScrollEndNotification) {
_onEndScroll(scrollNotification.metrics);
}
},
child: SingleChildScrollView(
/// YOUR OWN CODE HERE
)
)
И просто объявить метод как
_onStartScroll(ScrollMetrics metrics) {
print("Scroll Start");
}
_onUpdateScroll(ScrollMetrics metrics) {
print("Scroll Update");
}
_onEndScroll(ScrollMetrics metrics) {
print("Scroll End");
}
Вы будете уведомлены определенным способом.
Нет необходимости в NotificationListener
, мы можем использовать для этого только контроллер прокрутки.
Сначала зарегистрируйте обратный вызов пост-кадра, используя WidgetsBinding.instance.addPostFrameCallback
чтобы убедиться, что к этому моменту контроллер прокрутки уже связан с представлением прокрутки. Мы настроим слушателя в этом обратном вызове.
Для прослушивания прокручиваемого обновления мы можем использовать scrollController.addListener
.
Для прослушивания начала и остановки прокрутки мы можем использовать bgScrollCtrl.position.isScrollingNotifier.addListener
. Вы можете проверить код ниже:
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
scrollCtrl.addListener(() {
print('scrolling');
});
scrollCtrl.position.isScrollingNotifier.addListener(() {
if(!scrollCtrl.position.isScrollingNotifier.value) {
print('scroll is stopped');
} else {
print('scroll is started');
}
});
});
_scrollController.position.pixels
if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
//scroll end
}
чтобы использовать их, вы должны добавить слушателя к вашему scrollview
NotificationListner не работает для меня, потому что я анимирую прокрутку. Когда я касаюсь его, вызывается ScrollEndNotification.
Итак, чтобы обнаружить прокрутку, достигните нижней или верхней части. Я добавил Listner в scrollcontroller.
_scrollController.addListener(_scrollListener);
_scrollListener() {
if (_scrollController.offset >= _scrollController.position.maxScrollExtent &&
!_scrollController.position.outOfRange) {
setState(() {
debugPrint("reach the top");
});
}
if (_scrollController.offset <= _scrollController.position.minScrollExtent &&
!_scrollController.position.outOfRange) {
setState(() {
debugPrint("reach the top");
});
}
}
Вы можете использовать _scrollController.position.pixels для позиции прокрутки gettig и addlistener, чтобы получать уведомления об изменениях
if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){// для конца прокрутки}
if(_scrollController.position.pixels == _scrollController.position.minScrollExtent){// для прокрутки вверху}
Для этого варианта использования есть пакет. scroll_edge_listener
Вы можете определить начало или конец прокрутки с помощью нескольких конфигураций, таких как смещение и устранение дребезга. Просто оберните вид прокрутки с помощью
ScrollEdgeListener
и прикрепите прослушиватель.
ScrollEdgeListener(
edge: ScrollEdge.end,
edgeOffset: 400,
continuous: false,
debounce: const Duration(milliseconds: 500),
dispatch: true,
listener: () {
debugPrint('listener called');
},
child: ListView(
children: const [
Placeholder(),
Placeholder(),
Placeholder(),
Placeholder(),
],
),
),