Scroll 如何仅在用户滚动时显示小部件?
我想隐藏屏幕上的按钮,并显示他们后,用户开始滚动,直到5秒从最后一个滚动Scroll 如何仅在用户滚动时显示小部件?,scroll,dart,flutter,flutter-layout,Scroll,Dart,Flutter,Flutter Layout,我想隐藏屏幕上的按钮,并显示他们后,用户开始滚动,直到5秒从最后一个滚动 我已经用gesturedector包装了我的SingleChildScrollView,并将可见性值从onTap回调更改为使用visibility小部件隐藏我的按钮。但是,在GestureDetector上没有类似onScroll的事件 是否有人成功地实现了这种效果,或者是否有任何内置动画用于我试图实现的效果?你是对的,在GestureDetector上没有任何onScroll事件,但有onVerticalDrag事件,它
我已经用
gesturedector
包装了我的SingleChildScrollView
,并将可见性值从onTap
回调更改为使用visibility
小部件隐藏我的按钮。但是,在GestureDetector
上没有类似onScroll的事件
是否有人成功地实现了这种效果,或者是否有任何内置动画用于我试图实现的效果?你是对的,在
GestureDetector
上没有任何onScroll
事件,但有onVerticalDrag
事件,它们基本上是相同的,只是另一个名称
但是,为此,您实际上不需要
手势检测器。由于您已经在使用SingleChildScrollView
,因此您可以通过NotificationListener
收听滚动更改,处理ScrollStartNotification
和ScrollEndNotification
通知
我创建了一个小示例,向您展示将产生以下结果:
滚动时,显示按钮的标志被设置为true
,最后,如果没有更多滚动通知,它将重置回false
,并在5秒钟后重建树,而不使用按钮(这就是为什么在未来
完成后但在之前不设置\u buttonshow=false
的原因
bool\u buttonshow=false;
@凌驾
小部件构建(构建上下文){
List columnWidgets=List.filled(100,容器(高度:100.0,子级:占位符());
如果(_buttonshow){
columnWidgets=List.from(columnWidgets)
…插入(
3、可视性(child:RaisedButton(child:Text('Press me')、onPressed:(){})、visible:_buttonshow));
}
返回脚手架(
appBar:appBar(),
正文:NotificationListener(
onNotification:(滚动通知){
如果(scrollNotification为ScrollStartNotification){
如果(!\u按钮显示){
设置状态(()=>_buttonshow=true);
}
}else if(scrollNotification是ScrollEndNotification){
如果(_buttonshow){
_按钮显示=错误;
Future.delayed(持续时间(秒:5))。然后(()=>setState((){});
}
}
},
子:SingleChildScrollView(
子项:列(crossAxisAlignment:crossAxisAlignment.stretch,子项:columnWidgets),
),
),
);
}
感谢您的帮助,这些属性似乎可以工作。但是,如果我使用SingleChildScrollView包装GestureDetector(如您的示例中所示),并且如果使用GestureDetector包装我的SingleChildScrollView,则会锁定我的UI,而如果我使用GestureDetector包装我的SingleChildScrollView,则不会发生任何事情。实际上,您不需要使用GestureDetector
来实现这一点。只需使用SingleChildScroll查看和通知侦听器以处理所需的通知(开始和结束)你应该没问题。我已经相应地编辑了我的答案,并提供了一个小例子。它可以工作,但当没有足够的项目滚动时,按钮不会显示。我猜如果不需要,它不会呈现SingleChildScrollView。当有足够的项目滚动时,按钮只显示一次。你知道吗?SingleChildScrollVie如果您实际上不需要滚动,w
将不会滚动。如果屏幕已显示其所有内容,您不应期望用户开始滚动,因此您不应依赖滚动来显示该场景中的按钮。谢谢,我想我必须找到另一个解决方案。
bool _buttonShowing = false;
@override
Widget build(BuildContext context) {
List<Widget> columnWidgets = List<Widget>.filled(100, Container(height: 100.0, child: Placeholder()));
if (_buttonShowing) {
columnWidgets = List.from(columnWidgets)
..insert(
3, Visibility(child: RaisedButton(child: Text('Press me'), onPressed: () {}), visible: _buttonShowing));
}
return Scaffold(
appBar: AppBar(),
body: NotificationListener<ScrollNotification>(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollStartNotification) {
if (!_buttonShowing) {
setState(() => _buttonShowing = true);
}
} else if (scrollNotification is ScrollEndNotification) {
if (_buttonShowing) {
_buttonShowing = false;
Future.delayed(Duration(seconds: 5)).then((_) => setState(() {}));
}
}
},
child: SingleChildScrollView(
child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: columnWidgets),
),
),
);
}