startTracking method
Start tracking location
Implementation
Future<bool> startTracking([LocationSettings? settings]) async {
try {
if (_isTracking) {
debugPrint('Location tracking is already active');
return true;
}
final permission = await checkPermission();
if (!permission.isGranted) {
_errorController.add('Location permission not granted');
return false;
}
_currentSettings = settings ?? const LocationSettings();
// If background tracking is enabled, check background permission
if (_currentSettings!.enableBackgroundTracking) {
if (defaultTargetPlatform == TargetPlatform.android) {
final backgroundPermission = await Permission.locationAlways.status;
if (!backgroundPermission.isGranted) {
_errorController.add(
'Background location permission not granted. Please request it first.');
return false;
}
}
}
final locationSettings = _getLocationSettings(
_currentSettings!.accuracy,
distanceFilter: _currentSettings!.distanceFilter,
timeInterval: _currentSettings!.timeInterval,
);
_positionStreamSubscription = geo.Geolocator.getPositionStream(
locationSettings: locationSettings,
).listen(
(geo.Position position) {
final locationData = _convertPosition(position);
// Filter mock locations if not allowed
if (!_currentSettings!.allowMockLocations && locationData.isMocked) {
_errorController.add('Mock location detected and filtered');
return;
}
_lastLocation = locationData;
_locationController.add(locationData);
},
onError: (error) {
_errorController.add('Location stream error: $error');
},
);
_isTracking = true;
debugPrint('Location tracking started');
return true;
} catch (e) {
_errorController.add('Failed to start tracking: $e');
return false;
}
}