ScrollController如何检测Scroll的开始,停止和滚动?

时间:2019-05-10 06:13:47

标签: dart flutter

我正在将ScrollController用于SingleChildScrollView小部件,我想在其中检测何时开始滚动,结束/停止以及仍在滚动?

如何检测到我正在使用Listene

scrollController = ScrollController()
      ..addListener(() {
        scrollOffset = _scrollController.offset;
      });

也尝试使用_scrollController.position.activity.velocity,但没有帮助我。

还有

_scrollController.position.didEndScroll();
_scrollController.position.didStartScroll();

但是我怎么使用它呢?

5 个答案:

答案 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)

通过此链接 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");
  }

将通过特定方法通知您。

答案 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){ //用于顶部滚动 }