我有一个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/