簡體   English   中英

如何在flutter中的谷歌地圖上標記后實現alertDialog?

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

我想在谷歌地圖上做標記后顯示alertDialog,因為我想詢問用戶谷歌地圖上的標記是否正確。 何時顯示刪除功能對話框非常相似。 當我試圖在谷歌地圖上做標記時遇到了一些問題,谷歌地圖和 alerDialog 上的標記沒有顯示。 這是我的代碼。

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);
                  },
                ),
              ],
            )
          ],

        );
    }

  }

是不是因為我多次傳遞參數“竊聽”? 還是因為我沒有使用 showDialog? 我曾嘗試使用 showDialog 和 alertDialog 但它會顯示一些錯誤。 有什么我錯過的嗎? 有人幫我好嗎?

您可以使用Set<Marker>而不是Map<Marker,MarkerId>

聲明標記Set<Marker> markers = Set<Marker>();

要顯示標記和警報對話框,將 getMarker 方法更改為:

   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);
      }

並將 getData 方法更改為:

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);
                  },
                ),
              ],
            )
          ],

        ));
    }

最后更改markers: Set<Marker>.of(markers.values)markers: markers GoogleMap 小部件中的markers: markers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM