dart Flutter中的GoogleMap未响应触摸事件

zphenhs4  于 2023-02-06  发布在  Flutter
关注(0)|答案(8)|浏览(158)

我在Flutter应用程序中得到了两个不同的屏幕,它们使用谷歌Map(由这个X1 E0 F1 X提供)。
第一个控件的结构是
框架-〉列表视图-〉可见性-〉居中-〉大小框-〉GoogleMap
第二个屏幕是
框架-〉容器-〉列-〉大小框-〉GoogleMap
在两个屏幕上,我得到了相同的Map设置,但由于某种原因,在第一个屏幕上,Map没有响应任何触摸事件。

ycl3bljg

ycl3bljg1#

我也遇到了同样的问题,经过长时间的搜索,我找到了下面的解决方案,这样它就可以工作了:

GoogleMap(
   gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
      new Factory<OneSequenceGestureRecognizer>(() => new EagerGestureRecognizer(),),
   ].toSet(),)

原因是EagerGestureRecognizer是一款手势识别器,它热切地宣称自己在所有手势领域都取得了胜利。
参考:
Manage gestures priority between two widgets
propriedade gestureRecognizers

t9aqgxwy

t9aqgxwy2#

您需要通过设置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的小部件执行此操作,以便在将其放置在可滚动视图中时处理手势。

ycl3bljg

ycl3bljg3#

我认为这取决于您的父窗口小部件支持什么样的手势。
这种方式对我很有效。我的Map是TabBarView > ListView > GoogleMap

GoogleMap(
      gestureRecognizers: Set()
        ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer()))
        ..add(Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer()))
        ..add(Factory<TapGestureRecognizer>(() => TapGestureRecognizer()))
        ..add(Factory<VerticalDragGestureRecognizer>(
            () => VerticalDragGestureRecognizer())),
xcitsw88

xcitsw884#

我也遇到过类似的问题,但是我的Map在长条列表里面(实际上是SliverPersistentHeader)。添加平移手势起作用了,但是我仍然不能垂直滚动Map。所以我还添加了VerticalDragGestureRecognizer,它和预期的一样工作。

GoogleMap(
    gestureRecognizers: Set()
      ..add(Factory<PanGestureRecognizer>(() => PanGestureRecognizer()))
      ..add(Factory<VerticalDragGestureRecognizer>(
          () => VerticalDragGestureRecognizer())),
    // rest code
),

注意:您也可以添加另一个gestureRecognizer,例如:ScaleGestureRecognizer .

mcvgt66p

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,
      
    ),
  ),

rvpgvaaj

rvpgvaaj6#

查看第一个屏幕的小部件结构,我认为问题在于使用的ListView是可滚动的,因此所有触摸事件都传播到ListView而不是Map。
可以尝试将physics参数添加到ListView吗?可以尝试添加

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。

vsnjm48y

vsnjm48y7#

请记住,google_maps_flutter是一个开发人员预览版,版本为0.2。请耐心等待更多功能的添加。

xeufq47z

xeufq47z8#

我还发现了一个替代的和重构的代码,我认为它比我从这个源代码(https://api.flutter.dev/flutter/widgets/PlatformViewSurface/gestureRecognizers.html)中找到的更具可读性和更干净,并且同时也在工作。

GoogleMap(
...
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{
        Factory<OneSequenceGestureRecognizer>(
          () => EagerGestureRecognizer(),
        ),
      },
...
)

如消息来源所述,
EagerGestureRecognizer是一个特殊的手势识别器,它在指针按下事件后立即声明手势。
所以这个过程中最关键的部分是EagerGestureRecognizer。

相关问题