我有下面的代码,当用户向下或向上滚动时,可更改晶圆厂的不透明度。但是为此,我多次调用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;
}
});
}
问题是,每次控制器上发生新事件时,都会调用您添加的侦听器。这就是为什么您的 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();
}