Эта функция возвращает null вместо правильного значения для параметра масштабирования в CameraPosition, и я не могу понять это

У меня есть функция, которая вычисляет требуемую величину масштабирования CameraPosition в зависимости от расстояния между двумя маркерами карты Google. Вызывается метод, указанный в параметре масштабирования CameraPosition (zoomIn), который, в свою очередь, вызывает другой асинхронный метод, возвращающий расстояние между двумя точками (getDistance). Оба метода работают правильно, но zoomIn всегда возвращает значение null, несмотря на то, что оператор печати показывает правильное вычисленное значение. Это проблема синхронизации?


  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: GoogleMap(
            onMapCreated: addMarkers,
            cameraTargetBounds: CameraTargetBounds(createTargetBounds()),
            initialCameraPosition: CameraPosition(
                target:
                    LatLng((currentLocation.latitude + latitudesArr[selectedDestination]) / 2,
                          (currentLocation.longitude + longitudesArr[selectedDestination]) / 2),
                zoom: zoomIn(bounds: createTargetBounds(), padding: 200.0)),
          ),
        )
      ],
    );
  }

  double zoomIn({LatLngBounds bounds, double padding}) {
    double zoom;
    getDistance(bounds).then((double distance){
      print('Distance: $distance');
      if (distance > 200){
        zoom = 16.0;
      } else {
        zoom = 18.0;
      }
      print ('Zoom: $zoom');
    });
    return zoom;
  }

  Future<double> getDistance(LatLngBounds bounds) async {
    double distance = await Geolocator().distanceBetween(
        bounds.southwest.latitude,
        bounds.southwest.longitude,
        bounds.northeast.latitude,
        bounds.northeast.longitude);
    print('Distance: $distance');
    return distance;
  }


The zoomIn function correctly populates the zoom variable with 16.0 or 18.0 depending on the distance between the two markers. However, null is always returned.


0
0
44
1

Ответы 1

Хорошо, я понял, что правильный способ сделать это - жестко закодировать значение масштабирования, когда объявлен виджет карты Google, например:

class MapState extends State<MapRoute> {

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
          GoogleMap(
            onMapCreated: addMarkers,
            myLocationEnabled: true,
            cameraTargetBounds: CameraTargetBounds(createTargetBounds()),
            initialCameraPosition: CameraPosition(
                target:
                    LatLng((currentLocation.latitude + latitudesArr[selectedDestination]) / 2,
                          (currentLocation.longitude + longitudesArr[selectedDestination]) / 2),
                zoom: 18.0),
          ),

Затем в этом примере на методе addMarkers следующий код будет ждать, пока GeoLocator вернет расстояние, и только тогда можно будет определить желаемый уровень масштабирования. После этого остается только вызвать moveCamera(CameraUpdate.zoomTo(zoom)) контроллера карты следующим образом:

    await Geolocator().distanceBetween(
        bounds.southwest.latitude,
        bounds.southwest.longitude,
        bounds.northeast.latitude,
        bounds.northeast.longitude)
        .then((distance) {
          print('The Distance: $distance');
          double zoom;
          if (distance > 300) {
            zoom = 17.0;
          } else if (distance > 100){
            zoom = 18.0;
          } else {
            zoom = 19.0;
          }
          print ('Zoom: $zoom');
          controller.moveCamera(CameraUpdate.zoomTo(zoom));
        });

Другие вопросы по теме