0
votes

Google Maps pour Flutter - Obtenez une nouvelle position du marqueur après avoir fait glisser

Je souhaite créer un sélecteur de position dans Flutter à l'aide de google Google Maps pour Flutter et c'est marqueur. Il est possible de créer un marqueur déplaçable en créant un marqueur avec l'option de glissement définie sur true. En utilisant le segment de code suivant.

_mapController.markers.forEach((marker) {
  print("Pos: " + marker.options.position.toString())
});

// Prints "Pos: LatLng[7.2906, 80.63369999999998]"

Mais je ne trouve pas de moyen d'obtenir le nouvel emplacement du marqueur après avoir fait glisser le marqueur. J'ai essayé d'obtenir le nouvel emplacement du marqueur en faisant référence à l'attribut marqueurs du MapController mais il renvoie l'emplacement initial du marqueur.

Widget _buildMap(BuildContext context) {
  return GoogleMap(
    options: GoogleMapOptions(
      cameraPosition: CameraPosition(
        target: LatLng(7.2906, 80.6337),
        zoom: 7.0,
      ),
      compassEnabled: true,
    ),
    onMapCreated: (controller) {
      _mapController = controller;
      controller.addMarker(
        MarkerOptions(
          draggable: true,
          flat: false,
          position: LatLng(7.2906, 80.6337),
        ),
      );
    },
  );
}

Qu'est-ce que je fais de mal ici ou y a-t-il un autre moyen d'accomplir ce cas d'utilisation? Merci.


0 commentaires

3 Réponses :


2
votes

Ce package est un aperçu des développeurs, version 0.0.3. Ne le considérez pas pour le travail de production jusqu'à ce qu'il atteigne 1.0. En attendant, vous pouvez signaler un problème pour informer l'équipe Flutter de vos priorités spécifiques.


0 commentaires

1
votes

J'ai réussi cela en ajoutant un auditeur et quelques conditions

  mapController.addListener(() async {
      final cameraCoordinates = mapController.cameraPosition.target;
      if (!mapController.isCameraMoving &&
          widget.selectedPlace.options.position !=
              mapController.cameraPosition.target) {
        mapController.updateMarker(
            widget.selectedPlace, MarkerOptions(position: cameraCoordinates));
      }
    });

Ici, mapController est une instance de GoogleMapController.


0 commentaires

7
votes

Mon approche à ce problème consistait à utiliser la position de la caméra pour déplacer le marqueur, puis à utiliser la position actuelle de la caméra pour obtenir les nouvelles coordonnées. Vous devrez refactoriser un peu votre code pour utiliser les dernières modifications présentes dans la version 0.4 de google maps pour flutter, qui incluent ce rappel que vous devrez ajouter à votre code:

void _updatePosition(CameraPosition _position) {
    Position newMarkerPosition = Position(
        latitude: _position.target.latitude,
        longitude: _position.target.longitude);
    Marker marker = markers["your_marker"];

    setState(() {
      markers["your_marker"] = marker.copyWith(
          positionParam: LatLng(newMarkerPosition.latitude, newMarkerPosition.longitude));
    });
  }

Ensuite, vous pouvez définir le nouvel état de votre marqueur chaque fois que l'utilisateur déplace la caméra et utiliser ces coordonnées à toute autre fin dont vous avez besoin:

onCameraMove: ((_position) => _updateMarker(_position)),                        

Dites-moi si cela fonctionne!


2 commentaires

Marqueur marqueur = marqueurs ["votre_marqueur"]; Cette ligne donne une erreur car l'opérateur [] n'est pas défini pour la classe Set


Ce serait assez coûteux en termes de performances car il appelle à plusieurs reprises onCameraMove alors que la caméra continue de bouger.