简体   繁体   English

Flutter-谷歌地图标记导航到点击新屏幕

[英]Flutter- google maps marker navigate to new screen on tap

(1) I'm creating a list of markers within a for loop using Json data from an api (1) 我正在使用来自 api 的 Json 数据在 for 循环中创建标记列表

for (var i in postCodesJson['records']) {
      Marker marker = Marker(
          markerId: MarkerId(i["fields"]["postal_code"].toString()),
          position: LatLng(i["fields"]["latitude"] as double,
              i["fields"]["longitude"] as double),
          icon: mapMarkImg!,
          onTap: () {
            Get.to(HomePage(pCode: i["fields"]["postal_code"].toString()));
          });

      list.add(marker);

(2) i want it so as to when i tap on the marker it opens the HomePage(String STRING) the home page takes in a string it uses to builds it content (2)我想要它,以便当我点击它打开HomePage(String STRING)的标记时,主页接受一个用于构建内容的字符串

(3) i tried using the get package but it is not working and tried using navigator but I don't have a context (3) 我尝试使用 get package 但它不起作用并尝试使用导航器但我没有上下文

(4) when using get and i tap on the markers nothing happens. (4) 使用 get 时,我点击标记没有任何反应。

(5) here is my full code for the map page (5) 这是我的 map 页面的完整代码

import 'dart:async';
import 'dart:convert';
import 'package:area_app/main.dart';
import 'package:area_app/pages/home_page.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geocoding/geocoding.dart';
import 'package:http/http.dart' as http;
import 'package:get/get.dart';

class MapPage extends StatefulWidget {
  double longitude;
  double latitude;
  MapPage({Key? key, required this.longitude, required this.latitude})
      : super(key: key);
  @override
  _MapPageState createState() => _MapPageState(longitude, latitude);
}

double? cLat = latitude;
double? cLong = longitude;
String code = "";
Set<Marker> list = {};
BitmapDescriptor? mapMarkImg;

class _MapPageState extends State<MapPage> {
  double longitude;
  double latitude;
  _MapPageState(this.longitude, this.latitude);
  Completer<GoogleMapController> _controller = Completer();

  static final CameraPosition _kGooglePlex = CameraPosition(
    target: LatLng(cLat!, cLong!),
    zoom: 15.4746,
  );

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      //waits for stream to have data in it befor building the widget
      future: getCountry(longitude, latitude),
      builder: (context, snapshot) {
        return Scaffold(body: getBody(list));

        //returns the map
      },
    );
  }

  Widget getBody(Set<Marker> list) {
    return GoogleMap(
      //this gets the long and lat of the camera position and then returns a country code corisponding to that
      onCameraMove: (object) => {
        setState(() {
          cLat = object.target.latitude;
          cLong = object.target.longitude;
        })
      },
      markers: list,
      mapType: MapType.normal,
      buildingsEnabled: false,
      myLocationButtonEnabled: false,
      initialCameraPosition: _kGooglePlex,
      onMapCreated: (GoogleMapController controller) {
        _controller.complete(controller);
      },
    );
  }
}

//get country code
Future getCountry(double? long, double? lat) async {
  double lat1;

  double long1;
  lat1 = lat!;
  long1 = long!;
  mapMarkImg = await BitmapDescriptor.fromAssetImage(
      ImageConfiguration(), 'assets/images/marker.png');
  //code taken from geocoding pub dev page
  List<Placemark> placemarks = await placemarkFromCoordinates(lat1, long1);
  //get first entry in the list of placemarkers
  Placemark place = placemarks[0];
  if (code != place.isoCountryCode!) {
    code = place.isoCountryCode!;
    //get response
    var postCodesResponse = await http.get(Uri.parse(
        'https://data.opendatasoft.com/api/records/1.0/search/?dataset=geonames-postal-code%40public&q=${code}&rows=139&facet=country_code&facet=admin_name1&facet=admin_code1&facet=admin_name2'));

    final postCodesJson = jsonDecode(postCodesResponse.body.toString());
    //print(postCodesJson["records"][0]["datasetid"]);
    for (var i in postCodesJson['records']) {
      Marker marker = Marker(
          markerId: MarkerId(i["fields"]["postal_code"].toString()),
          position: LatLng(i["fields"]["latitude"] as double,
              i["fields"]["longitude"] as double),
          icon: mapMarkImg!,
          onTap: () {
            Get.to(HomePage(pCode: i["fields"]["postal_code"].toString()));
          });

      list.add(marker);
      print(list.length);
    }
  }
}

First of all check that is there any data in list (markers) variable and if there isn't any data then in Future getCountry(double? long, double? lat) function check that if (code.= place.isoCountryCode!) { this condition is true or false is has to be true if add data into list .首先检查list (标记)变量中是否有任何数据,如果没有任何数据,则在 Future getCountry(double? long, double? lat) function 检查if (code.= place.isoCountryCode!) {如果将数据添加到list ,则此条件为truefalse必须为真。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM