我有一个 ListView,在其顶部有一个地图,我希望当 ListView 滚动时地图滚动到视图之外,但我也希望用户能够与地图交互。因此,滚动应该仅在用户在其他 ListView 小部件上滚动时发生,而不是在他们在地图上滚动时发生,然后我希望将手势直接应用于地图。
但目前,当用户在地图上滚动时,它会滚动整个 ListView。
我已经尝试过我在这里遇到的其他建议在 Flutter 中,子部件如何阻止其可滚动父部件的滚动?我添加了一个GestureDetector
正如上面帖子的答案中所建议的,将地图容器包装在下面的示例中,但这只是在地图上滚动时阻止了 ListView 和地图的滚动。视频链接https://i.stack.imgur.com/3Ngqw.jpg
这是我的构建方法返回的小部件。该代码取决于google_maps_flutter
plugin.
Container(
height: MediaQuery.of(context).size.height,
child:
ListView.builder(
itemCount: 12 + 1,
itemBuilder: (context, index) {
if (index == 0) return GestureDetector(
onVerticalDragUpdate: (_){},
child: Container(
height: MediaQuery.of(context).size.height / 2,
child: GoogleMap(initialCameraPosition: initalPosition),
),
);
else return ListTile(title: Text("$index"),);
}
)
),
我原本希望地图能够捕获手势,但事实并非如此,包含它的列表视图捕获了所有手势。谁能建议我如何强制将列表中该项目的所有手势直接传递到地图,并且在滚动列表中的其他项目时仍然使列表滚动?
接受的答案(埃塞特·穆罕默德截至撰写本文时,答案已标记为例外)太复杂了,就我而言,它甚至不起作用!它提供了从左到右的滚动、平移和缩放,但是从上到下的滚动仍然滚动ListView
.
真正的解决方案非常简单,因为GoogleMap
默认情况下有这些手势检测器。您只需指定手势检测的优先级必须为GoogleMap
并不是ListView
。这是通过给予来实现的GoogleMap
反对EagerGestureRecognizer
例如以下方式。
ListView(
children: <Widget>[
Text('a'),
Text('b'),
GoogleMap(
...,
gestureRecognizers: {
Factory<OneSequenceGestureRecognizer>(
() => EagerGestureRecognizer(),
),
},
),
],
)
这样,发生在屏幕上或上方的所有手势GoogleMap
对象的优先级将由GoogleMap
而不是任何其他小部件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)