How to implement alertDialog after marker on google maps in flutter?

Issue

I want to show alertDialog after making marker on google maps because I want to ask user whether the marker on google maps is true or not. It quite similar when to show dialog for delete function. I got some problem when I was tried to make marker on google maps, the marker on google maps and alerDialog did not show. Here is my code.

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fyp/model/Location.dart';
import 'package:fyp/model/Task.dart';
import 'package:fyp/service/database.dart';
import 'package:geoflutterfire/geoflutterfire.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geocoder/geocoder.dart' as geoCo;





class Geolocation extends StatefulWidget {
  final Task task;

  const Geolocation({Key key, this.task}) : super(key: key);

  @override
  _GeolocationState createState() => _GeolocationState(task) ;
}

class _GeolocationState extends State<Geolocation> {
  Task task;
  _GeolocationState(Task task){
    this.task = task;
  }

  GoogleMapController googleMapController;
  Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
  Position position;
  String addressLocation;
  LocationTask loc;



  void getMarkers(double lat, double long) {
    MarkerId markerId = MarkerId(lat.toString() + long.toString());
    Marker _marker = Marker(
        draggable: false,
        markerId: markerId,
        position: LatLng(lat, long),
        zIndex: 2,
        icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueCyan),
        infoWindow: InfoWindow(snippet: addressLocation));
    setState(() {
      markers[markerId] = _marker;
    });
  }

  getLocation(tapped) async{
    final coordinated = new geoCo.Coordinates(tapped.latitude, tapped.longitude);
    final FirebaseAuth auth = FirebaseAuth.instance;
    final FirebaseUser rd = await auth.currentUser();
    final String email = rd.email;
    var address = await geoCo.Geocoder.local.findAddressesFromCoordinates(coordinated);
    GeoFirePoint firePoint = new GeoFirePoint(tapped.latitude, tapped.longitude);
    var firstAddress = address.first;
    addressLocation = firstAddress.addressLine;
    DateTime _dateTime = DateTime.now();
    String id = Firestore.instance
        .collection("Location")
        .document()
        .documentID;
    loc = LocationTask(
        dateTime: _dateTime,
        email: email,
        docId: id,
        address: addressLocation,
        position: firePoint.geoPoint,
        noAduan: task.noAduan,
        kategori: task.kategori
    );
    await DatabaseService().addlocation(loc);
  }

  @override
  void dispose() {
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Google Maps"),
        backgroundColor: Colors.redAccent,
      ),
      body:  Container(
        child: GoogleMap(
            onTap: (tapped)  {
             getData(tapped);
            },
            mapType: MapType.normal,
            compassEnabled: true,
            myLocationButtonEnabled: true,
            onMapCreated: (GoogleMapController controller) {
              setState(() {
                googleMapController = controller;
              });
            },
            initialCameraPosition: CameraPosition(
                target: LatLng(3.12803968168713, 101.5910096431367),
                zoom: 15.0),
            markers: Set<Marker>.of(markers.values)
        ),
      ),
    );
  }
  getData(tapped){
        return AlertDialog(
          title: Text("Is there true your location"),
          content: Text("$addressLocation"),
          actions: [
            Row(
              children: [
                FlatButton(
                  child: Text('Yes'),
                  onPressed: () {
                    getLocation(tapped);
                  },
                ),
                FlatButton(
                  child: Text('No'),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                ),
              ],
            )
          ],

        );
    }

  }

Is there because I pass parameter the "tapped" many times? or because I did not using showDialog? I had tried to use showDialog and alertDialog but it will show some error. Is there anything that I missing out? someone help me please?

Solution

you can use Set<Marker> Instead Of Map<Marker,MarkerId>

declare Set of Marker Set<Marker> markers = Set<Marker>();

to display Marker and alert Dialog change getMarker method to :

   void getMarkers(double lat, double long) {
        MarkerId markerId = MarkerId(lat.toString() + long.toString());
        Marker _marker = Marker(
            draggable: false,
            markerId: markerId,
            position: LatLng(lat, long),
            zIndex: 2,
            icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueCyan),
            infoWindow: InfoWindow(snippet: addressLocation));
        setState(() {
          markers.add(_marker);
        });
getData(_marker.position);
      }

and change getData method to :

getData(tapped){

        showDialog(
                context:context,
child:
     AlertDialog(
          title: Text("Is there true your location"),
          content: Text("$addressLocation"),
          actions: [
            Row(
              children: [
                FlatButton(
                  child: Text('Yes'),
                  onPressed: () {
                    getLocation(tapped);
                  },
                ),
                FlatButton(
                  child: Text('No'),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                ),
              ],
            )
          ],

        ));
    }

finally change markers: Set<Marker>.of(markers.values) to markers: markers in GoogleMap widget

Answered By – Yahya Nasser Al-weshly

Answer Checked By – David Marino (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *