Проблема в том, что в этом случае 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');