onStart method

  1. @override
Future<void> onStart(
  1. DateTime timestamp,
  2. SendPort? sendPort
)
override

Called when the task is started.

Implementation

@override
Future<void> onStart(DateTime timestamp, SendPort? sendPort) async {
  debugPrint("[DEBUG] TaskHandler.onStart called at $timestamp");
  _sendPort = sendPort;

  // Check location permission
  bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    debugPrint("[ERROR] Location services are disabled at $timestamp");
    _sendPort?.send("Location services are disabled");
    return;
  }

  LocationPermission permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    debugPrint("[ERROR] Location permission denied at $timestamp");
    _sendPort?.send("Location permission denied");
    return;
  }

  if (permission == LocationPermission.deniedForever) {
    debugPrint("[ERROR] Location permissions permanently denied at $timestamp");
    _sendPort?.send("Location permissions permanently denied");
    return;
  }

  // Start continuous location updates
  _positionSubscription = Geolocator.getPositionStream(
    locationSettings: const LocationSettings(
      accuracy: LocationAccuracy.high,
      distanceFilter: 5, // Update every 5 meters
    ),
  ).listen(
    (Position position) {
      // Send the position to the main isolate
      _sendPort?.send(position);
      debugPrint("[DEBUG] Location update in isolate: ${position.latitude}, ${position.longitude} at ${DateTime.now()}");
    },
    onError: (error) {
      debugPrint("[ERROR] Location stream error in isolate: $error at ${DateTime.now()}");
      _sendPort?.send("Location stream error: $error");
    },
  );

  // Send initial status message
  _sendPort?.send("Foreground location tracking started");
}