【问题标题】:How add marker with google_maps_flutter?如何使用 google_maps_flutter 添加标记?
【发布时间】:2021-07-04 16:49:01
【问题描述】:

我正在使用 google_maps_flutter,我想知道如何在单击地图上的某个位置时添加标记。我是 Flutter 新手。

import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class SearchGaragesInMapScreenMap extends StatefulWidget {
  @override
  State<SearchGaragesInMapScreenMap> createState() =>
      SearchGaragesInMapScreenMapState();
}

class SearchGaragesInMapScreenMapState
    extends State<SearchGaragesInMapScreenMap> {
  final Completer<GoogleMapController> _controller = Completer();
  LatLng _myPosition = const LatLng(-12.0316827, -77.0492965);
  BitmapDescriptor _markerIcon = BitmapDescriptor.defaultMarker;

  @override
  void initState() {
    super.initState();
    _getMyPosition();
  }

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      mapType: MapType.normal,
      initialCameraPosition: CameraPosition(target: _myPosition, zoom: 15),
      onMapCreated: (GoogleMapController controller) {
        _controller.complete(controller);
      },
      markers: {
        _positionMarker(
          '1',
          _myPosition.latitude,
          _myPosition.longitude,
          /*AppMarkers.myMarker, 55, 35*/
        )
      },
      zoomControlsEnabled: false,
    );
  }

  Marker _positionMarker(String id, double latitude, double longitude,
      [String iconUrl, double iconWidth = 18, double iconHeight = 40]) {
    _setMarkerIcon(iconUrl, iconWidth, iconHeight);
    log('$_markerIcon');
    return Marker(
        markerId: MarkerId(id),
        position: LatLng(latitude, longitude),
        icon: _markerIcon);
  }

  void _getMyPosition() async {
    final Position _position = await _determinePosition();
    setState(() {
      _myPosition = LatLng(_position.latitude, _position.longitude);
    });
  }

  void _setMarkerIcon(
      [String iconUrl, double iconWidth, double iconHeight]) async {
    if (iconUrl != null) {
      final BitmapDescriptor _icon = await BitmapDescriptor.fromAssetImage(
          ImageConfiguration(size: Size(iconWidth, iconHeight)), iconUrl);
      setState(() {
        _markerIcon = _icon;
      });
    }
  }
}

Future<Position> _determinePosition() async {
  bool serviceEnabled;
  LocationPermission permission;
  serviceEnabled = await Geolocator
      .isLocationServiceEnabled(); // Verifica si este disp. tiene los servicios de ubicacion habilitados
  if (!serviceEnabled) {
    return Future.error('Location services are disabled.');
  }
  permission =
      await Geolocator.checkPermission(); // El usuario de permisos de ubicación
  if (permission == LocationPermission.deniedForever) {
    return Future.error(
        'Location permissions are permantly denied, we cannot request permissions.');
  }
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission != LocationPermission.whileInUse &&
        permission != LocationPermission.always) {
      return Future.error(
          'Location permissions are denied (actual value: $permission).');
    }
  }
  return await Geolocator.getCurrentPosition();
}

这是我的代码,这是我从 pub.dev 页面获得的代码。如果它显示设备上的地图,那么在这种情况下没有问题。

这是我第一次在颤振中使用地图,我有点迷茫。 如果您有任何文档、教程或视频,将会非常有帮助。

【问题讨论】:

  • 你走对了。您只需将屏幕坐标转换为地图坐标并将 GestureDetector 添加到地图即可。 (不记得了,但也许 GoogleMap 也有 TapDownDetails)

标签: flutter flutter-layout flutter-dependencies flutter-test


【解决方案1】:

您可以使用onTap 回调。

 Set<Marker> markers = { _positionMarker(
          '1',
          _myPosition.latitude,
          _myPosition.longitude,
          /*AppMarkers.myMarker, 55, 35*/
        )};
       
  
Widget build(BuildContext context) {
    return GoogleMap(
      onTap: (position) => createCurrentMarker(position),
      mapType: MapType.normal,
      initialCameraPosition: CameraPosition(target: _myPosition, zoom: 15),
      onMapCreated: (GoogleMapController controller) {
        _controller.complete(controller);
      },
      markers: markers,
      zoomControlsEnabled: false,
    );
  }


//this is your add marker function
 void createCurrentMarker(LatLng position) async {
       setState(() {
          markers.add(Marker(markerId: MarkerId('new location'), position: position
          ));
    });
  }

【讨论】:

  • 您好,在 createCurrentMarker 方法中,我得到未定义的标记。
  • 我编辑了我的代码,使用新的设置。您在小部件之前定义一组标记,并在他的地图中使用markers:markers,尝试一下,它应该可以工作
  • 如果解决了您的问题,请将其标记为您问题的正确答案,谢谢!
猜你喜欢
  • 2019-10-20
  • 2020-01-30
  • 2020-01-15
  • 1970-01-01
  • 2019-04-07
  • 2020-10-18
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多