【问题标题】:Google map in Flutter not responding to touch eventsFlutter中的谷歌地图没有响应触摸事件
【发布时间】:2019-06-14 06:52:47
【问题描述】:

我在 Flutter 应用程序中有两个不同的屏幕,它们使用 Google 地图(由 library 提供)。

第一个的小部件结构是

Scaffold -> ListView -> Visibility -> Center -> SizedBox -> GoogleMap

第二个屏幕是

Scaffold -> Container -> Column -> SizedBox -> GoogleMap

在两个屏幕上,我的地图设置相同,但由于某种原因,第一个屏幕上的地图没有响应任何触摸事件。

【问题讨论】:

    标签: google-maps dart flutter


    【解决方案1】:

    查看第一个屏幕的小部件结构,我认为问题在于使用的ListView 保持可滚动。 因此,所有的触摸事件都会传播到ListView 而不是地图。

    您可以尝试将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*/
          ],
        )
      );
    

    注意:您需要在水平方向开始滚动才能使地图滚动工作,因为在垂直滚动的情况下它将默认为 ListView。

    【讨论】:

    • 这是一种似乎对我有用的方法,它可能对你有用:将ListView 的孩子包裹在Column 中,即 Visibilty 层并设置'mainAxisSize: MainAxisSize.max'为列。删除ListView 的physics 属性,并为ListView 的itemExtent: 添加一些有限双精度值。我将使用对我有用的示例代码来更新我的答案
    【解决方案2】:

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

    【讨论】:

    • 谢谢,除了PanGestureRecognizer还应该加什么手势识别器?
    • 我认为你可以添加任何实现OneSequenceGestureRecognizer 所以ScaleGestureRecognizer 和TapGestureRecognizer
    • 我添加了 PanGestureRecognizer、ScaleGestureRecognizer 和 TapGestureRecognizer。当我开始在地图上垂直滚动时 - 地图仍然没有响应,因此滚动了所有列表视图。但是如果我开始水平滚动地图 - 它可以工作,我也可以在垂直方向移动手指。所以问题是我现在无法开始垂直滚动
    • @moonvader 你找到解决方案了吗?我遇到了同样的问题。当我添加 VerticalDragGestureRecognizer 时它曾经可以工作,但现在不行了。编辑:找到解决方案。我刚刚从下面的答案中添加了手势识别器。
    • 不适用于VerticalDrag,这是主要问题,即使您在gestureDetectors 的GoogleMap 对象集中指定VerticalDragGestureDetector。其他答案包含解决方案。
    【解决方案3】:

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

    【讨论】:

    • 那么你的意思是什么 - 等到它发布?可能需要几个月的时间
    • 这是谷歌的作品,他们不能对期货发表评论。
    【解决方案4】:

    我有类似的问题,但在我的情况下,地图位于 sliver 列表中(实际上是 SliverPersistentHeader)。添加平移手势有效,但我仍然无法垂直滚动地图。所以我还添加了VerticalDragGestureRecognizer,它按预期工作。

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

    注意:您还可以添加另一个手势识别器,例如:ScaleGestureRecognizer。

    【讨论】:

      【解决方案5】:

      我认为这取决于您的父小部件支持哪种手势。

      这种方式对我有用。我的地图在TabBarView &gt; ListView &gt; GoogleMap

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

      【讨论】:

        【解决方案6】:

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

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

        原因是EagerGestureRecognizer 是一个手势识别器,它急切地宣称在所有手势领域都取得了胜利。

        参考:

        Manage gestures priority between two widgets

        propriedade gestureRecognizers

        【讨论】:

        • 出于某种原因,我认为这个比其他的工作效率更高。手势更快。
        • 这对我有用。这样就解决了将gmaps放在tabbar里面的问题。
        • 这也允许平移,非常完美!谢谢!!
        • 我需要在模态底页中添加地图小部件,这个对我有用。
        • 太棒了!非常感谢!我还注意到地图的更好响应性 - 这是一个额外的好处。
        【解决方案7】:

        用Gesture Detector包装并添加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,
              
            ),
          ),
        

        ]1}

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多