Dart ScrollController如何检测滚动开始、停止和滚动?

Dart ScrollController如何检测滚动开始、停止和滚动?,dart,flutter,Dart,Flutter,我正在为SingleChildScrollView小部件使用ScrollController,我想在其中检测滚动开始、结束/停止和仍然滚动的时间 如何检测,我正在使用Listene scrollController = ScrollController() ..addListener(() { scrollOffset = _scrollController.offset; }); 还可以尝试使用\u scrollController.position.

我正在为
SingleChildScrollView
小部件使用ScrollController,我想在其中检测滚动开始、结束/停止和仍然滚动的时间

如何检测,我正在使用
Listene

scrollController = ScrollController()
      ..addListener(() {
        scrollOffset = _scrollController.offset;
      });
还可以尝试使用
\u scrollController.position.activity.velocity
,但没有帮助我

还有

_scrollController.position.didEndScroll();
_scrollController.position.didStartScroll();
但是我怎么用呢

_scrollController.position.pixels

if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
//scroll end
}
要使用这些,您应该从此链接向scrollview添加一个侦听器

只需将您的
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
               )
)

您将通过特定的方法收到通知。

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");
      });
    }
  }
\u scrollController.addListener(\u scrollListener);
_scrollListener(){
如果(\u scrollController.offset>=\u scrollController.position.maxScrollExtent&&
!\u滚动控制器。位置。超出范围){
设置状态(){
调试打印(“到达顶部”);
});
}

如果(_scrollController.offset不需要
NotificationListener
,我们可以单独使用scroll controller进行此操作

首先,使用
WidgetsBinding.instance.addPostFrameCallback
注册后期帧回调,以确保此时滚动控制器已与滚动视图关联。我们将在该回调中设置侦听器

要收听滚动更新,我们可以使用
scrollController.addListener

要收听开始和停止滚动,我们可以使用
bgcrollctrl.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');
        }
      });
    });

谢谢,但我想检测滚动的开始和停止。你可以只检测滚动的结束。这是我的错误,让我更新问题你可以使用position.pixels for it你怎么能给我expampleif position.pixels大于minScrollExtent然后滚动开始这是我想要的,简短而精确。谢谢分享!)
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');
        }
      });
    });