使用DART-不能获取json对象字段并添加到谷歌地图标记对象



(1(我的应用程序需要从调用的api获取坐标

(3( 我打印了回复,这就是它给我的

{
"nhits": 139,
"parameters": {
"dataset": [
"geonames-postal-code@public"
],
"rows": 10,
"start": 0,
"facet": [
"country_code",
"admin_name1",
"admin_code1",
"admin_name2"
],
"format": "json",
"timezone": "UTC"
},
"records": [
{
"datasetid": "geonames-postal-code@public",
"recordid": "b26080136ddb5feb5771b7b69953305f9d7dfeef",
"fields": {
"postal_code": "D08",
"admin_name1": "Leinster",
"place_name": "Dublin 8",
"country_code": "IE",
"coordinates": [
53.3346,
-6.2733
],
"admin_code1": "L",
"latitude": 53.3346,
"longitude": -6.2733
},
"geometry": {
"type": "Point",
"coordinates": [
-6.2733,
53.3346
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "9e697cace21428468c9e4e9bc44f2b1f8bf2b860",
"fields": {
"postal_code": "N37",
"admin_name1": "Leinster",
"place_name": "Athlone",
"country_code": "IE",
"coordinates": [
53.4228,
-7.9372
],
"admin_code1": "L",
"latitude": 53.4228,
"accuracy": 4,
"longitude": -7.9372
},
"geometry": {
"type": "Point",
"coordinates": [
-7.9372,
53.4228
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "187f59cc0a419aa52403903bf6424239e0d4b58c",
"fields": {
"postal_code": "P56",
"admin_name1": "Munster",
"place_name": "Charleville",
"country_code": "IE",
"coordinates": [
52.35,
-8.6833
],
"admin_code1": "M",
"latitude": 52.35,
"accuracy": 4,
"longitude": -8.6833
},
"geometry": {
"type": "Point",
"coordinates": [
-8.6833,
52.35
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "51c501dd3a996cc1a184ae051208edddc89ae3f5",
"fields": {
"postal_code": "D11",
"admin_name1": "Leinster",
"place_name": "Dublin 11",
"country_code": "IE",
"coordinates": [
53.3899,
-6.293
],
"admin_code1": "L",
"latitude": 53.3899,
"longitude": -6.293
},
"geometry": {
"type": "Point",
"coordinates": [
-6.293,
53.3899
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "d51c23cd3ad68b02c62db072352efae58badecb7",
"fields": {
"postal_code": "R93",
"admin_name1": "Leinster",
"place_name": "Carlow",
"country_code": "IE",
"coordinates": [
52.8408,
-6.9261
],
"admin_code1": "L",
"latitude": 52.8408,
"accuracy": 4,
"longitude": -6.9261
},
"geometry": {
"type": "Point",
"coordinates": [
-6.9261,
52.8408
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "30f01b294f53ec478dc10bd5b8ea8a9d97c7283a",
"fields": {
"postal_code": "P72",
"admin_name1": "Munster",
"place_name": "Bandon",
"country_code": "IE",
"coordinates": [
51.7469,
-8.7425
],
"admin_code1": "M",
"latitude": 51.7469,
"accuracy": 4,
"longitude": -8.7425
},
"geometry": {
"type": "Point",
"coordinates": [
-8.7425,
51.7469
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "9ef1246a9613898a0b53610cecc87bc7ad470cd0",
"fields": {
"postal_code": "T12",
"admin_name1": "Munster",
"place_name": "Cork city southside",
"country_code": "IE",
"coordinates": [
51.8728,
-8.4902
],
"admin_code1": "M",
"latitude": 51.8728,
"longitude": -8.4902
},
"geometry": {
"type": "Point",
"coordinates": [
-8.4902,
51.8728
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "f97dbc8d75902eed5d362970e108c95ccc193e21",
"fields": {
"postal_code": "F92",
"admin_name1": "Ulster",
"place_name": "Letterkenny",
"country_code": "IE",
"coordinates": [
54.95,
-7.7333
],
"admin_code1": "U",
"latitude": 54.95,
"accuracy": 4,
"longitude": -7.7333
},
"geometry": {
"type": "Point",
"coordinates": [
-7.7333,
54.95
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "b676e5a6ee40c1ff1489917ed028474d1e2810d8",
"fields": {
"postal_code": "N41",
"admin_name1": "Connacht",
"place_name": "Carrick On Shannon",
"country_code": "IE",
"coordinates": [
53.9469,
-8.09
],
"admin_code1": "C",
"latitude": 53.9469,
"accuracy": 4,
"longitude": -8.09
},
"geometry": {
"type": "Point",
"coordinates": [
-8.09,
53.9469
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
},
{
"datasetid": "geonames-postal-code@public",
"recordid": "a5caf8ece3a46fb2d7ba84219acbb4cea918179b",
"fields": {
"postal_code": "P14",
"admin_name1": "Leinster",
"place_name": "Crookstown",
"country_code": "IE",
"coordinates": [
53.0153,
-6.8106
],
"admin_code1": "L",
"latitude": 53.0153,
"accuracy": 4,
"longitude": -6.8106
},
"geometry": {
"type": "Point",
"coordinates": [
-6.8106,
53.0153
]
},
"record_timestamp": "2022-07-09T23:00:01.653Z"
}
],
"facet_groups": [
{
"name": "country_code",
"facets": [
{
"name": "IE",
"count": 139,
"state": "refined",
"path": "IE"
}
]
},
{
"name": "admin_name1",
"facets": [
{
"name": "Leinster",
"count": 68,
"state": "displayed",
"path": "Leinster"
},
{
"name": "Munster",
"count": 43,
"state": "displayed",
"path": "Munster"
},
{
"name": "Connacht",
"count": 18,
"state": "displayed",
"path": "Connacht"
},
{
"name": "Ulster",
"count": 10,
"state": "displayed",
"path": "Ulster"
}
]
},
{
"name": "admin_code1",
"facets": [
{
"name": "L",
"count": 68,
"state": "displayed",
"path": "L"
},
{
"name": "M",
"count": 43,
"state": "displayed",
"path": "M"
},
{
"name": "C",
"count": 18,
"state": "displayed",
"path": "C"
},
{
"name": "U",
"count": 10,
"state": "displayed",
"path": "U"
}
]
}
]
}

(2( 我在response.body上使用jsonDecode()

(3( 然后我尝试获取Fields数组并循环以获得每个postal_code、每个longitude和每个latitude

(4( 这是我的密码。getCountry()方法不将标记对象添加到集合当我打印post_Code、经度和纬度时,它们是空的

(5( 打印列表长度在循环中也为空

import 'dart:async';
import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.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;
class MapPage extends StatefulWidget {
@override
_MapPageState createState() => _MapPageState();
}
double? cLat = 53.390;
double? cLong = -6.293;
class _MapPageState extends State<MapPage> {
Completer<GoogleMapController> _controller = Completer();
static final CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(53.3346, -6.2733),
zoom: 15.4746,
);
@override
Widget build(BuildContext context) {
return FutureBuilder(
//waits for stream to have data in it befor building the widget
future: getCountry(cLong, cLat),
builder: (context, snapshot) {
if (snapshot.data == null) {
return Scaffold(body: Text("it NO works"));
} else {
return Scaffold(body: Text("it  work"));
}
//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<Set<Marker>> getCountry(double? long, double? lat) async {
double lat1;
double long1;
lat1 = lat!;
long1 = long!;
String code = "";
Set<Marker> list = {};
//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];
var postCodesResponse = await http.get(Uri.parse(
'https://data.opendatasoft.com/api/records/1.0/search/?dataset=geonames-postal-code%40public&q=&facet=country_code&facet=admin_name1&facet=admin_code1&facet=admin_name2&refine.country_code=${place.isoCountryCode!}'));
// print("lol" + postCodesResponse.body);
var postCodesJson = jsonDecode(postCodesResponse.body);
// var name = postCodesJson['records']["fields"][1]["postal_code"];
// var lat2 = postCodesJson['records']["fields"][1]["latitude"];
// var long2 = postCodesJson['records']["fields"][1]["longitude"];
// print(name);
// print(lat2);
///print(long2);
if (code != place.isoCountryCode!) {
for (var i in postCodesJson['records']) {
Marker marker = Marker(
markerId: MarkerId(i["fields"]["postal_code"]),
position: LatLng(i["fields"]["latitude"], i["fields"]["longitude"]));
list.add(marker);
print(list.length);
}
code = place.isoCountryCode!;
return list;
}
return list;
}

任何建议都将不胜感激:(非常感谢。

我尝试在Android模拟器上运行您的代码,方法是在Material应用程序等中用Scaffold包装MapPage((。(不过我不得不调整minSdkVersion(当编译和运行代码时,会显示Text("它有效"(,我无法复制您的错误。调试和查看每一行,我会说,每一行都做它应该做的事情

import 'dart:async';
import 'dart:convert';
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;
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: MapPage(),
);
}
}
class MapPage extends StatefulWidget {
@override
_MapPageState createState() => _MapPageState();
}
double? cLat = 53.390;
double? cLong = -6.293;
class _MapPageState extends State<MapPage> {
Completer<GoogleMapController> _controller = Completer();
static final CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(53.3346, -6.2733),
zoom: 15.4746,
);
@override
Widget build(BuildContext context) {
return FutureBuilder(
//waits for stream to have data in it befor building the widget
future: getCountry(cLong, cLat),
builder: (context, snapshot) {
if (snapshot.data == null) {
return Scaffold(body: Text("it NO works"));
} else {
return Scaffold(body: Text("it  work"));
}
//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<Set<Marker>> getCountry(double? long, double? lat) async {
double lat1;
double long1;
lat1 = lat!;
long1 = long!;
String code = "";
Set<Marker> list = {};
//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];
var postCodesResponse = await http.get(Uri.parse(
'https://data.opendatasoft.com/api/records/1.0/search/?dataset=geonames-postal-code%40public&q=&facet=country_code&facet=admin_name1&facet=admin_code1&facet=admin_name2&refine.country_code=${place.isoCountryCode!}'));
// print("lol" + postCodesResponse.body);
var postCodesJson = jsonDecode(postCodesResponse.body);
// var name = postCodesJson['records']["fields"][1]["postal_code"];
// var lat2 = postCodesJson['records']["fields"][1]["latitude"];
// var long2 = postCodesJson['records']["fields"][1]["longitude"];
// print(name);
// print(lat2);
///print(long2);
if (code != place.isoCountryCode!) {
for (var i in postCodesJson['records']) {
Marker marker = Marker(
markerId: MarkerId(i["fields"]["postal_code"]),
position: LatLng(i["fields"]["latitude"], i["fields"]["longitude"]));
list.add(marker);
print(list.length);
}
code = place.isoCountryCode!;
return list;
}
return list;
}

最新更新