我正在将ScrollController用于SingleChildScrollView
小部件,我想在其中检测何时开始滚动,结束/停止以及仍在滚动?
如何检测到我正在使用Listene
scrollController = ScrollController()
..addListener(() {
scrollOffset = _scrollController.offset;
});
也尝试使用_scrollController.position.activity.velocity
,但没有帮助我。
还有
_scrollController.position.didEndScroll();
_scrollController.position.didStartScroll();
但是我怎么使用它呢?
答案 0 :(得分:2)
不需要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');
}
});
});
答案 1 :(得分:1)
只需将您的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");
}
将通过特定方法通知您。
答案 2 :(得分:0)
_scrollController.position.pixels
if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
//scroll end
}
要使用这些功能,您应该在滚动视图中添加一个侦听器
答案 3 :(得分:0)
NotificationListner对我不起作用,因为我为scrollview设置了动画。当我触摸它时,会调用 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");
});
}
}
答案 4 :(得分:0)
您可以使用 _scrollController.position.pixels 获取 gettig 滚动位置并使用 addlistener 来通知更改
if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){ //滚动结束 }
if(_scrollController.position.pixels == _scrollController.position.minScrollExtent){ //用于顶部滚动 }