我有一个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
,至少可以说,这使用户烦恼。
答案 0 :(得分:0)
我今天正在使用相同类型的小部件。您不需要包含NotificationListener的GestureDetector。这是多余的,根据我的经验,它会覆盖它内部或下面的scrollListener(取决于您将其放置在父/子方案还是堆栈方案中)。处理NotificationListener本身中的所有内容。包括更新容器的高度。如果您需要可滚动容器增长才能滚动,那么我将我的带有“扩展”布尔的堆栈放到堆栈中,然后在滚动容器顶部反应性地构建一个手势检测器。然后,当它展开时,我使用NotificationListener来处理它的拖动位移。
Stack(children:[
NotificationListener(/* scroll view stuff */),
expanded ? GestureDetector() : Container()
]);