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

我无法弄清楚如何将touch事件分配给正确的组件,我尝试了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,这对用户来说至少是令人讨厌的。

最佳答案

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

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

关于dart - GestureDetector里面的ScrollView : Dispatch Touch Events,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55103738/

10-12 02:37