如何检测用户滚动的最后方向

问题描述 投票:0回答:1

我有下面的代码,当用户向下或向上滚动时,可更改晶圆厂的不透明度。但是为此,我多次调用setState()方法。有什么方法可以检测到用户滚动的最后一个方向,以便此时我只能调用[Cnce] Once?或者,如果您可以为此定义一个新的增强功能,我将不胜感激。

setState()

这是列表

@override
void initState() {
super.initState();
_controller = ScrollController()
  ..addListener(() {
    upDirection = _controller.position.userScrollDirection == ScrollDirection.forward;
    upDirection = _controller.position.userScrollDirection == ScrollDirection.reverse;


      if (upDirection)
        setState(() {
          _scrolled = 0.5;
          flag = false;
        });
      else if (!upDirection) {
        setState(() {
          _scrolled = 1.0;
        });
        flag = false;
      }

  });
}
flutter flutter-layout flutter-animation
1个回答
0
投票

问题是,每次控制器上发生新事件时,都会调用您添加的侦听器。这就是为什么您的 return Scaffold( body: SingleChildScrollView( controller: _controller, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Container(), Container(), Container(), Container(), Container(), Container(), ], ), ), ), floatingActionButton: AnimatedOpacity( opacity: _scrolled, duration: Duration(milliseconds: 100), child: FloatingActionButton( onPressed: (){}, child: Icon(Icons.settings), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, ); 被反复调用的原因。

您可以使用标志来防止重复调用setState

工作代码

setState

DEMO:

void initState() { ScrollDirection _lastScrollDirection; // <---- Notice the new variable here. _controller = ScrollController(); _controller.addListener(() { if (_lastScrollDirection != _controller.position.userScrollDirection) { _lastScrollDirection = _controller.position.userScrollDirection; setState(() { //You can set whatever you want here. //It will only get called once when user changes direction. }); print('Scroll direction changed --> $_lastScrollDirection'); } }); super.initState(); }

© www.soinside.com 2019 - 2024. All rights reserved.