import 'package:geolocator/geolocator.dart'; enum LocationAttachmentFailure { serviceDisabled, permissionDenied, unavailable, } class LocationAttachmentResult { final Position? position; final LocationAttachmentFailure? failure; const LocationAttachmentResult._({this.position, this.failure}); const LocationAttachmentResult.success(Position value) : this._(position: value); const LocationAttachmentResult.failed(LocationAttachmentFailure value) : this._(failure: value); } class LocationAttachmentController { Future resolveCurrentPosition() async { try { if (!await Geolocator.isLocationServiceEnabled()) { return const LocationAttachmentResult.failed( LocationAttachmentFailure.serviceDisabled, ); } var permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); } if (permission == LocationPermission.denied || permission == LocationPermission.deniedForever) { return const LocationAttachmentResult.failed( LocationAttachmentFailure.permissionDenied, ); } final position = await Geolocator.getCurrentPosition( locationSettings: const LocationSettings( accuracy: LocationAccuracy.high, ), ); return LocationAttachmentResult.success(position); } catch (_) { return const LocationAttachmentResult.failed( LocationAttachmentFailure.unavailable, ); } } }