我有一个用于隐藏和显示底部导航栏的滚动侦听器,它工作得很好,但我发现如果我滚动得太快,它会在满足条件时触发该功能近 50 次甚至更多。这意味着它会多次重建小部件,对吗?我怎样才能防止这种情况发生。
updateBottomBar
是一个回调函数来设置父控件的状态。
bottomBarVisible
是显示和隐藏底部导航栏的变量。
@override
void initState() {
scrollController.addListener(() {
//listener
if (scrollController.position.userScrollDirection ==
ScrollDirection.reverse &&
widget.bottomBarVisible == true) {
print("it is hide");
widget.updateBottomBar(false);
} else if (scrollController.position.userScrollDirection ==
ScrollDirection.forward &&
widget.bottomBarVisible == false) {
print("it is show");
widget.updateBottomBar(true);
}
});
我看到您已经在通过调用
widget.bottomBarVisible == true
将其设置为false
之前检查widget.updateBottomBar(false)
。那么这意味着,它只会调用你的函数一次,对吧?
如果不是这种情况,也许您没有足够快地更新
bottomBarVisible
变量。我建议您在 updateBottomBar()
函数中首先更新变量,以防止快速触发。
addListener
滚动未完成时多次工作。您可以使用 atEdge
函数处理,该函数将在滚动完成时返回 true
。
sController.position.atEdge
sController.addListener(() async {
if (sController.position.userScrollDirection ==
ScrollDirection.reverse && sController.position.atEdge) {
goNextPage();
} else if (sController.position.userScrollDirection ==
ScrollDirection.forward && sController.position.atEdge) {
goPreviousPage();
}
});