import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:latlong2/latlong.dart'; class GeocodingService { static const platform = MethodChannel('deckers.thibault/aves/geocoding'); // geocoding requires Google Play Services static Future> getAddress(LatLng coordinates, String locale) async { try { final result = await platform.invokeMethod('getAddress', { 'latitude': coordinates.latitude, 'longitude': coordinates.longitude, 'locale': locale, // we only really need one address, but sometimes the native geocoder // returns nothing with `maxResults` of 1, but succeeds with `maxResults` of 2+ 'maxResults': 2, }); return (result as List).cast().map((map) => Address.fromMap(map)).toList(); } on PlatformException catch (e) { debugPrint('getAddress failed with code=${e.code}, exception=${e.message}, details=${e.details}}'); } return []; } } @immutable class Address { final String addressLine, adminArea, countryCode, countryName, featureName, locality, postalCode, subAdminArea, subLocality, subThoroughfare, thoroughfare; const Address({ this.addressLine, this.adminArea, this.countryCode, this.countryName, this.featureName, this.locality, this.postalCode, this.subAdminArea, this.subLocality, this.subThoroughfare, this.thoroughfare, }); factory Address.fromMap(Map map) => Address( addressLine: map['addressLine'], adminArea: map['adminArea'], countryCode: map['countryCode'], countryName: map['countryName'], featureName: map['featureName'], locality: map['locality'], postalCode: map['postalCode'], subAdminArea: map['subAdminArea'], subLocality: map['subLocality'], subThoroughfare: map['subThoroughfare'], thoroughfare: map['thoroughfare'], ); }