import 'dart:async'; 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'; import 'models/yourLocation.dart'; Future getUserLocation( GlobalKey scaffoldKey) async { // Platform messages may fail, so we use a try/catch PlatformException. try { final Location location0 = Location(); final LocationData location = await location0.getLocation(); // It seems that the lib fails with lat/lon values final YourLocation yl = YourLocation( id: ObjectId(), lat: location.latitude!, lon: location.longitude!); String 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) { } } return yl; } on PlatformException catch (e) { final BuildContext? context = scaffoldKey.currentContext; if (context != null) { if (e.code == 'PERMISSION_DENIED') { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(S.of(context).notPermsUbication), )); } else if (e.code == 'PERMISSION_DENIED_NEVER_ASK') {} ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(S.of(context).isYourUbicationEnabled), )); } return YourLocation.noLocation; } } Future getReverseLocation( {required double lat, required double lon, bool external = false}) async { try { final List placemarks = await geo.placemarkFromCoordinates(lat, lon); if (placemarks.isNotEmpty) { final geo.Placemark first = placemarks.first; final String address = '${first.street}, ${first.locality}, ${first.administrativeArea}, ${first.country}'; return address; } else { return 'Unable to determine address'; } } catch (e) { throw Exception('Failed to reverse geocode: $e'); } }