【问题标题】:How to use Navigator.push() in Google maps widget (with context = null)?如何在 Google 地图小部件中使用 Navigator.push()(上下文 = null)?
【发布时间】:2019-08-13 21:55:06
【问题描述】:

我有一个 Flutter 应用程序,我在其中使用 Google 地图小部件(刚刚更新到 0.4.0)在屏幕上显示一些标记。每个标记对应一个商店,并有一个带有商店名称的信息窗口。我希望当我们点击信息窗口时,会出现商店页面。

这似乎没有那么复杂,这是我所做的:

Marker marker = Marker(
  consumeTapEvents: false,
  markerId: MarkerId(markerId.toString()),
  position:
      LatLng(truck.situation.position.lat, truck.situation.position.long),
  infoWindow: InfoWindow(
    title: truck.name,
    onTap: ({BuildContext context}) {
      Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => TruckScreen(truck: truck)
          ),
      );
    },
  ),
);

但是当我点击窗口时,什么也没有发生。

我想我找到了问题所在:当我们点击信息窗口时,方法 _handleMethodCall(MethodCall call) 在 controller.dart 文件中被调用:

case 'infoWindow#onTap':
        _googleMapState.onInfoWindowTap(call.arguments['markerId']);
        break;

上下文不作为参数传递,因此,当我进入调用 Navigator.push 的 onTap 方法时,上下文为空。

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

    标签: android google-maps dart flutter


    【解决方案1】:

    Marker 类中的 onTap 方法不传递上下文 google_maps_flutter/lib/src/marker.dart#L45 并且因为您将上下文参数添加到 onTap 方法回调中,它会覆盖来自 build 方法的上下文值。

    您需要从构建方法中获取上下文。只需删除 ({BuildContext context})

    Marker marker = Marker(
      consumeTapEvents: false,
      markerId: MarkerId(markerId.toString()),
      position:
          LatLng(truck.situation.position.lat, truck.situation.position.long),
      infoWindow: InfoWindow(
        title: truck.name,
        onTap: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => TruckScreen(truck: truck)),
          );
        },
      ),
    );
    

    【讨论】:

    • 多么新手的错误,糟糕的复制/粘贴...:
    猜你喜欢
    • 2020-11-13
    • 2021-04-03
    • 1970-01-01
    • 2020-04-06
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2012-04-06
    相关资源
    最近更新 更多