我在Flutter应用程序中得到了两个不同的屏幕,它们使用谷歌Map(由这个X1 E0 F1 X提供)。第一个控件的结构是框架-〉列表视图-〉可见性-〉居中-〉大小框-〉GoogleMap第二个屏幕是框架-〉容器-〉列-〉大小框-〉GoogleMap在两个屏幕上,我得到了相同的Map设置,但由于某种原因,在第一个屏幕上,Map没有响应任何触摸事件。
ycl3bljg1#
我也遇到了同样的问题,经过长时间的搜索,我找到了下面的解决方案,这样它就可以工作了:
GoogleMap( gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[ new Factory<OneSequenceGestureRecognizer>(() => new EagerGestureRecognizer(),), ].toSet(),)
原因是EagerGestureRecognizer是一款手势识别器,它热切地宣称自己在所有手势领域都取得了胜利。参考:Manage gestures priority between two widgetspropriedade gestureRecognizers
EagerGestureRecognizer
t9aqgxwy2#
您需要通过设置gestureRecognizers属性来告诉GoogleMap小部件您希望它响应哪些手势,如下所示:
gestureRecognizers
GoogleMap
import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; ... GoogleMap( initialCameraPosition: CameraPosition( target: LatLng(0, 0), ), gestureRecognizers: Set() ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer())) );
这并不是特定于GoogleMap小部件,您需要对任何隐藏使用AndroidView/UIKitView的小部件执行此操作,以便在将其放置在可滚动视图中时处理手势。
AndroidView
UIKitView
ycl3bljg3#
我认为这取决于您的父窗口小部件支持什么样的手势。这种方式对我很有效。我的Map是TabBarView > ListView > GoogleMap
TabBarView > ListView > GoogleMap
GoogleMap( gestureRecognizers: Set() ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer())) ..add(Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer())) ..add(Factory<TapGestureRecognizer>(() => TapGestureRecognizer())) ..add(Factory<VerticalDragGestureRecognizer>( () => VerticalDragGestureRecognizer())),
xcitsw884#
我也遇到过类似的问题,但是我的Map在长条列表里面(实际上是SliverPersistentHeader)。添加平移手势起作用了,但是我仍然不能垂直滚动Map。所以我还添加了VerticalDragGestureRecognizer,它和预期的一样工作。
VerticalDragGestureRecognizer
GoogleMap( gestureRecognizers: Set() ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer())) ..add(Factory<VerticalDragGestureRecognizer>( () => VerticalDragGestureRecognizer())), // rest code ),
注意:您也可以添加另一个gestureRecognizer,例如:ScaleGestureRecognizer .
ScaleGestureRecognizer
mcvgt66p5#
使用手势检测器换行并添加 onVerticalStart
GestureDetector( onVerticalDragStart: (start) {}, child: GoogleMap( gestureRecognizers: Set() ..add(Factory<OneSequenceGestureRecognizer>( () => new EagerGestureRecognizer())) ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer())) ..add( Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer())) ..add(Factory<TapGestureRecognizer>(() => TapGestureRecognizer())) ..add(Factory<VerticalDragGestureRecognizer>( () => VerticalDragGestureRecognizer())), onMapCreated: (GoogleMapController c) { _controller.complete(c); }, initialCameraPosition: CameraPosition( target: LatLng(9.856326, 78.285448), zoom: 10.4746, ), mapType: MapType.normal, ), ),
rvpgvaaj6#
查看第一个屏幕的小部件结构,我认为问题在于使用的ListView是可滚动的,因此所有触摸事件都传播到ListView而不是Map。可以尝试将physics参数添加到ListView吗?可以尝试添加
ListView
physics
ListView( physics: NeverScrollableScrollPhysics(), /*Rest of the ListView implementation*/ )
更新:工作示例
return Scaffold( body: ListView( itemExtent: MediaQuery.of(context).size.height*1.2, children: <Widget>[ Column( mainAxisSize: MainAxisSize.max, children: <Widget>[ buildMap(), /*The map function*/ Container( /*Any other child widget*/ ) ], ), /*Any other child widgets in the List*/ ], ) );
注意:您需要开始水平滚动,Map滚动才能正常工作,因为垂直滚动时默认为ListView。
vsnjm48y7#
请记住,google_maps_flutter是一个开发人员预览版,版本为0.2。请耐心等待更多功能的添加。
google_maps_flutter
xeufq47z8#
我还发现了一个替代的和重构的代码,我认为它比我从这个源代码(https://api.flutter.dev/flutter/widgets/PlatformViewSurface/gestureRecognizers.html)中找到的更具可读性和更干净,并且同时也在工作。
GoogleMap( ... gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{ Factory<OneSequenceGestureRecognizer>( () => EagerGestureRecognizer(), ), }, ... )
如消息来源所述,EagerGestureRecognizer是一个特殊的手势识别器,它在指针按下事件后立即声明手势。所以这个过程中最关键的部分是EagerGestureRecognizer。
8条答案
按热度按时间ycl3bljg1#
我也遇到了同样的问题,经过长时间的搜索,我找到了下面的解决方案,这样它就可以工作了:
原因是
EagerGestureRecognizer
是一款手势识别器,它热切地宣称自己在所有手势领域都取得了胜利。参考:
Manage gestures priority between two widgets
propriedade gestureRecognizers
t9aqgxwy2#
您需要通过设置
gestureRecognizers
属性来告诉GoogleMap
小部件您希望它响应哪些手势,如下所示:这并不是特定于
GoogleMap
小部件,您需要对任何隐藏使用AndroidView
/UIKitView
的小部件执行此操作,以便在将其放置在可滚动视图中时处理手势。ycl3bljg3#
我认为这取决于您的父窗口小部件支持什么样的手势。
这种方式对我很有效。我的Map是
TabBarView > ListView > GoogleMap
xcitsw884#
我也遇到过类似的问题,但是我的Map在长条列表里面(实际上是SliverPersistentHeader)。添加平移手势起作用了,但是我仍然不能垂直滚动Map。所以我还添加了
VerticalDragGestureRecognizer
,它和预期的一样工作。注意:您也可以添加另一个gestureRecognizer,例如:
ScaleGestureRecognizer
.mcvgt66p5#
使用手势检测器换行并添加 onVerticalStart
rvpgvaaj6#
查看第一个屏幕的小部件结构,我认为问题在于使用的
ListView
是可滚动的,因此所有触摸事件都传播到ListView
而不是Map。可以尝试将
physics
参数添加到ListView
吗?可以尝试添加更新:工作示例
注意:您需要开始水平滚动,Map滚动才能正常工作,因为垂直滚动时默认为ListView。
vsnjm48y7#
请记住,
google_maps_flutter
是一个开发人员预览版,版本为0.2。请耐心等待更多功能的添加。xeufq47z8#
我还发现了一个替代的和重构的代码,我认为它比我从这个源代码(https://api.flutter.dev/flutter/widgets/PlatformViewSurface/gestureRecognizers.html)中找到的更具可读性和更干净,并且同时也在工作。
如消息来源所述,
EagerGestureRecognizer是一个特殊的手势识别器,它在指针按下事件后立即声明手势。
所以这个过程中最关键的部分是EagerGestureRecognizer。