Scroll 如何仅在用户滚动时显示小部件?

Scroll 如何仅在用户滚动时显示小部件?,scroll,dart,flutter,flutter-layout,Scroll,Dart,Flutter,Flutter Layout,我想隐藏屏幕上的按钮,并显示他们后,用户开始滚动,直到5秒从最后一个滚动 我已经用gesturedector包装了我的SingleChildScrollView,并将可见性值从onTap回调更改为使用visibility小部件隐藏我的按钮。但是,在GestureDetector上没有类似onScroll的事件 是否有人成功地实现了这种效果,或者是否有任何内置动画用于我试图实现的效果?你是对的,在GestureDetector上没有任何onScroll事件,但有onVerticalDrag事件,它

我想隐藏屏幕上的按钮,并显示他们后,用户开始滚动,直到5秒从最后一个滚动


我已经用
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),
        ),
      ),
    );
  }