70 lines
1.8 KiB
Dart
70 lines
1.8 KiB
Dart
import 'package:geolocator/geolocator.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
class LocationService {
|
|
static final LocationService _instance = LocationService._internal();
|
|
factory LocationService() => _instance;
|
|
LocationService._internal();
|
|
|
|
Future<bool> requestLocationPermission() async {
|
|
final status = await Permission.location.request();
|
|
return status.isGranted;
|
|
}
|
|
|
|
Future<bool> checkLocationPermission() async {
|
|
final status = await Permission.location.status;
|
|
return status.isGranted;
|
|
}
|
|
|
|
Future<Position?> getCurrentLocation() async {
|
|
try {
|
|
final hasPermission = await checkLocationPermission();
|
|
if (!hasPermission) {
|
|
final granted = await requestLocationPermission();
|
|
if (!granted) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
final isServiceEnabled = await Geolocator.isLocationServiceEnabled();
|
|
if (!isServiceEnabled) {
|
|
return null;
|
|
}
|
|
|
|
return await Geolocator.getCurrentPosition(
|
|
desiredAccuracy: LocationAccuracy.high,
|
|
);
|
|
} catch (e) {
|
|
print('Error getting current location: $e');
|
|
return null;
|
|
}
|
|
}
|
|
|
|
Stream<Position> getLocationStream() {
|
|
return Geolocator.getPositionStream(
|
|
locationSettings: const LocationSettings(
|
|
accuracy: LocationAccuracy.high,
|
|
distanceFilter: 10,
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<double> calculateDistance(
|
|
double startLatitude,
|
|
double startLongitude,
|
|
double endLatitude,
|
|
double endLongitude,
|
|
) async {
|
|
return Geolocator.distanceBetween(
|
|
startLatitude,
|
|
startLongitude,
|
|
endLatitude,
|
|
endLongitude,
|
|
) / 1000; // Convert to kilometers
|
|
}
|
|
|
|
Future<void> openLocationSettings() async {
|
|
await Geolocator.openLocationSettings();
|
|
}
|
|
}
|