background_locator_fixed
background_locator_fixed copied to clipboard
In android 12+, service stopped automatically after random time.
import 'dart:isolate'; import 'dart:ui';
import 'package:background_locator_2/background_locator.dart'; import 'package:background_locator_2/location_dto.dart'; import 'package:background_locator_2/settings/android_settings.dart'; import 'package:background_locator_2/settings/ios_settings.dart'; import 'package:background_locator_2/settings/locator_settings.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:route/data/repositories/hive_repository.dart'; import 'package:route/data/repositories/rest_api_repository.dart'; import 'package:route/domain/entites/local_trip.dart'; import 'package:route/domain/repositories/database_repository.dart'; import 'package:route/domain/repositories/json_body/update_location_json_body.dart'; import 'package:route/domain/repositories/local_storage_repository.dart'; import 'package:route/network/network_repository.dart'; import 'package:route/util/dependency/app_dependency.dart'; import 'package:route/util/services/location_service.dart'; import 'package:route/util/services/phone_info_service.dart';
class BackgroundLocatorRepository { LocalStorageRepository localStorageRepository = HiveRepository(); static DatabaseRepository databaseRepository = RestAPIRepository( networkRepository: NetworkRepository(localStorageRepository: HiveRepository())); static PhoneInfoService phoneInfoService = PhoneInfoService();
ReceivePort port = ReceivePort(); static const String _isolateName = "LocatorIsolate";
bool isRunning = false; LocationService locationService = LocationService();
late Function(LatLng) onLocationChange;
initialize() { if (IsolateNameServer.lookupPortByName(_isolateName) != null) { IsolateNameServer.removePortNameMapping(_isolateName); } IsolateNameServer.registerPortWithName(port.sendPort, _isolateName); port.listen( (dynamic data) async { // debugPrint("location changes : ${data}"); // await _updateUI(data); }, ); _initPlatformState(); }
Future
Future
Future
void onStop() async { IsolateNameServer.removePortNameMapping(_isolateName); await BackgroundLocator.unRegisterLocationUpdate(); isRunning = await BackgroundLocator.isServiceRunning(); debugPrint("IS RUNNING : $isRunning"); }
void onStart(LocalTrip localTrip) async { await localStorageRepository.saveLocalTrip(localTrip: localTrip); await _startLocator(); isRunning = await BackgroundLocator.isServiceRunning(); debugPrint("IS RUNNING : $isRunning"); }
Future
@pragma('vm:entry-point') static void callback(LocationDto locationDto) async { final SendPort? send = IsolateNameServer.lookupPortByName(_isolateName); print("=============> SENDING TO PORT : ${locationDto.toJson()}"); if (!HiveRepository.isInitialized) { await HiveRepository.initialize(); } LocalStorageRepository _localStorageRepository = HiveRepository(); LocalTrip? localTrip = await _localStorageRepository.getLocalTrip(); databaseRepository .updateTripLocation( updateLocationJsonBody: UpdateLocationJsonBody( localId: int.parse(localTrip!.localId), imei: await phoneInfoService.getIMEI(), lat: locationDto.latitude.toString(), long: locationDto.longitude.toString(), time: DateTime.now().millisecondsSinceEpoch.toString())) .then((value) {}) .onError((error, stackTrace) { print("ERROR WHILE CALLING UPDATE ${error.toString()}"); }); send?.send(locationDto.toJson()); }
//Optional @pragma('vm:entry-point') static void initCallback(dynamic _) { print('Plugin initialization'); }
//Optional @pragma('vm:entry-point') static void notificationCallback() { print('User clicked on the notification'); }
static void disposeCallback() async { print("++++++++ DISPOSED"); final SendPort? send = IsolateNameServer.lookupPortByName(_isolateName); send?.send(null); } }