【问题标题】:How to show a widget only when user is scrolling?如何仅在用户滚动时显示小部件?
【发布时间】:2019-07-20 09:47:51
【问题描述】:

我想隐藏屏幕上的按钮,并在用户开始滚动到最后一次滚动后的 5 秒后显示它们。

我已经用GestureDetector 包裹了我的SingleChildScrollView,并将可见性值从onTap 回调更改为使用Visibility 小部件隐藏我的按钮。但是,GestureDetector 上没有像 onScroll 这样的事件。

是否有人成功实现了该效果,或者我想要实现的目标是否有任何内置动画?

【问题讨论】:

    标签: scroll dart flutter flutter-layout


    【解决方案1】:

    你说得对,GestureDetector 上没有onScroll 事件,但是有onVerticalDrag 事件,基本相同,只是换了个名字。

    但是,为此,您实际上并不需要GestureDetector。您可以收听滚动更改,使用NotificationListener 处理ScrollStartNotificationScrollEndNotification 通知,因为您已经在使用SingleChildScrollView

    我创建了一个小示例,向您展示将产生以下结果: 在滚动标志以显示按钮时,按钮设置为true,最后,它将重置回false,并在 5 秒后重建没有按钮的树,如果中间没有滚动通知(这就是为什么在Future 完成之后但之前,您不要设置_buttonShowing = false

    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),
            ),
          ),
        );
      }
    

    【讨论】:

    • 感谢您的帮助,这些属性似乎可以使用。但是,如果我用 SingleChildScrollView 包装 GestureDetector,它会锁定我的 UI,就像在你的例子中一样,如果我用 GestureDetector 包装我的 SingleChildScrollView,什么都不会发生。
    • 实际上你不需要GestureDetector。通过仅使用 SingleChildScrollViewNotificationListener 来处理您需要的通知(开始和结束),您应该没问题。我已经相应地编辑了我的答案并提供了一个小例子。
    • 它可以工作,但是当没有足够的项目滚动时,按钮不会显示。我猜如果不需要它,它不会呈现 SingleChildScrollView。当有足够的项目滚动时,按钮只显示一次。有什么想法吗?
    • 如果您实际上不需要滚动,SingleChildScrollView 不会滚动。如果屏幕已经显示其所有内容,您不应期望用户开始滚动,因此您不应依赖滚动来显示该场景 IMO 的按钮。
    • 谢谢,我想我必须找到另一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多