Как извлечь городскую местность и страну из геокодерного ответа во флаттере - PullRequest
0 голосов
/ 13 октября 2019

У меня уже есть ответ от геокодера со всем читаемым адресом. Я хочу хороший способ получить город и страну с этого адреса

Я пробовал этот метод, но он не работал

print(json.decode(response.body)['results'][0].getLocality());//didnt work

вот мой код:


  final url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$GOOGLE_API_KEY';
  final response = await http.get(url);
  print(response.body);
  print(json.decode(response.body)['results'][0].getLocality());//didnt work
  return  json.decode(response.body)['results'][0]['formatted_address'];

}```

1 Ответ

0 голосов
/ 13 октября 2019

Проблема в том, что в этом случае json.decode(response.body) можно просто использовать как Map, поэтому вы не можете вызвать метод, который не имеет, например getLocality().

в состоянии сделать это, вы должны проанализировать JSON в объект, который имеет этот метод. Я рекомендую вам эту статью, чтобы узнать больше о разборе JSON: Синтаксический анализ JSON во Flutter


Если вы хотите получить доступ к country и locality без разбора JSON,Вы можете сделать что-то вроде этого:

String body = '{"results":[{"address_components":[{"long_name":"1600","short_name":"1600","types":["street_number"]},{"long_name":"Amphitheatre Pkwy","short_name":"Amphitheatre Pkwy","types":["route"]},{"long_name":"Mountain View","short_name":"Mountain View","types":["locality","political"]},{"long_name":"Santa Clara County","short_name":"Santa Clara County","types":["administrative_area_level_2","political"]},{"long_name":"California","short_name":"CA","types":["administrative_area_level_1","political"]},{"long_name":"United States","short_name":"US","types":["country","political"]},{"long_name":"94043","short_name":"94043","types":["postal_code"]}],"formatted_address":"1600 Amphitheatre Parkway, Mountain View, CA 94043, USA","geometry":{"location":{"lat":37.4224764,"lng":-122.0842499},"location_type":"ROOFTOP","viewport":{"northeast":{"lat":37.4238253802915,"lng":-122.0829009197085},"southwest":{"lat":37.4211274197085,"lng":-122.0855988802915}}},"place_id":"ChIJ2eUgeAK6j4ARbn5u_wAGqWA","types":["street_address"]}],"status":"OK"}';
List<dynamic> addressComponents =
    json.decode(body)['results'][0]['address_components'];
String country = addressComponents
    .firstWhere((entry) => entry['types'].contains('country'))['long_name'];
String locality = addressComponents.firstWhere(
    (entry) => entry['types'].contains('locality'))['long_name'];
print('country: $country');
print('locality: $locality');

В случае, если может быть более одного country или locality, вы можете сделать это:

List<dynamic> countries = addressComponents
    .where((entry) => entry['types'].contains('country'))
    .toList()
    .map((entry) => entry['long_name'])
    .toList();
List<dynamic> localities = addressComponents
    .where((entry) => entry['types'].contains('locality'))
    .toList()
    .map((entry) => entry['long_name'])
    .toList();
print('countries: $countries');
print('localities: $localities');
...