Как использовать Navigator.push () в виджете карт Google (с context = null)? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть приложение Flutter, в котором я использую виджет Google Maps (только что обновленный до 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) вызывается в файле controller.dart:

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

Контекстне передается в качестве параметра, и поэтому, когда я захожу в метод onTap, где я вызываю Navigator.push, контекст равен нулю.

Кто-нибудь знает, как это исправить?Спасибо!

1 Ответ

0 голосов
/ 23 марта 2019

Метод onTap в классе Marker не передает контекст google_maps_flutter / Библиотека / SRC / marker.dart # L45 и поскольку вы добавляете аргумент контекста в метод обратного вызова метода onTap, он переопределяет значение контекста из метода сборки.

Вам необходимо получить контекст из вашего метода сборки. Просто удалите ({контекст BuildContext})

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)),
      );
    },
  ),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...