GestureDetector内部的ScrollView:调度触摸事件

时间:2019-03-11 14:09:17

标签: dart flutter

我有一个GestureDetector,负责将容器上下拖动以更改高度。容器的内容可能太长,因此必须滚动内容。

我无法弄清楚如何将触摸事件分配给正确的组件,我尝试使用IgnorePointer并更改了ignoring属性。

class _SlideSheetState extends State<SlideSheet>

  bool _ignoreScrolling = true;

  GestureDetector(
    onVerticalDragUpdate: (DragUpdateDetails details) {
      if(isDraggedUp) {
        setState(() {
          _ignoreScrolling = false
        });          
      }
      // update height of container, omitted for simplicity
    },
    child: NotificationListener(
      onNotification: (ScrollNotification notification) {
            if(notification is OverscrollNotification) {

              if(notification.overscroll < 0) {
                  // the scrollview is scrolled to top
                  setState(() {
                     _ignoreScrolling = true;
                  });

              }

            }
       },
       child: IgnorePointer(
         ignoring: _ignoreScrolling,
         child: SingleChildScrollView(
           physics: ClampingScrollPhysics(),
           child: Container(
             // ...
           )
         )
       )
  )

有人知道在Widget树上下分配触摸事件的好方法吗?因为显然,在我的解决方案中,您始终必须进行一次触摸事件,才能将“监听器”从GestureDetector更改为SingleChildScrollView,至少可以说,这使用户烦恼。

1 个答案:

答案 0 :(得分:0)

我今天正在使用相同类型的小部件。您不需要包含NotificationListener的GestureDetector。这是多余的,根据我的经验,它会覆盖它内部或下面的scrollListener(取决于您将其放置在父/子方案还是堆栈方案中)。处理NotificationListener本身中的所有内容。包括更新容器的高度。如果您需要可滚动容器增长才能滚动,那么我将我的带有“扩展”布尔的堆栈放到堆栈中,然后在滚动容器顶部反应性地构建一个手势检测器。然后,当它展开时,我使用NotificationListener来处理它的拖动位移。

Stack(children:[
  NotificationListener(/* scroll view stuff */),
  expanded ? GestureDetector() : Container()
]);