import 'dart:async'; import 'package:fires_flutter/models/yourLocation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:geocoding/geocoding.dart' as geo; import 'package:location/location.dart'; import 'package:objectid/objectid.dart'; import 'generated/i18n.dart'; Future getUserLocation( GlobalKey scaffoldKey) async { // Platform messages may fail, so we use a try/catch PlatformException. try { Location _location = new Location(); LocationData location = await _location.getLocation(); // It seems that the lib fails with lat/lon values var yl = new YourLocation( id: ObjectId(), lat: location.latitude!, lon: location.longitude!); var address; try { address = await getReverseLocation(lat: yl.lat, lon: yl.lon); yl.description = address; } catch (e) { try { address = await getReverseLocation(lat: yl.lat, lon: yl.lon, external: true); yl.description = address; } catch (e) { print('We cannot reverse geolocate'); } } return yl; } on PlatformException catch (e) { final context = scaffoldKey.currentContext; if (context != null) { if (e.code == 'PERMISSION_DENIED') { ScaffoldMessenger.of(context).showSnackBar(new SnackBar( content: new Text(S.of(context).notPermsUbication), )); } else if (e.code == 'PERMISSION_DENIED_NEVER_ASK') {} ScaffoldMessenger.of(context).showSnackBar(new SnackBar( content: new Text(S.of(context).isYourUbicationEnabled), )); } return YourLocation.noLocation; } } Future getReverseLocation( {required double lat, required double lon, bool external = false}) async { try { List placemarks = await geo.placemarkFromCoordinates(lat, lon); if (placemarks.isNotEmpty) { var first = placemarks.first; String address = '${first.street}, ${first.locality}, ${first.administrativeArea}, ${first.country}'; print("${first.name} : $address"); return address; } else { return 'Unable to determine address'; } } catch (e) { print("Error in reverse geocoding: $e"); throw Exception("Failed to reverse geocode: $e"); } }