geolocator

14.1.2

Geolocation plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API for generic location (GPS etc.) functions.

Download archive

Readme

Flutter Geolocator Plugin

pub package Build status style: effective dart codecov

A Flutter geolocation plugin which provides easy access to platform specific location services (FusedLocationProviderClient or if not available the LocationManager on Android and CLLocationManager on iOS).

Features

  • Get the last known location;
  • Get the current location of the device;
  • Get continuous location updates;
  • Check if location services are enabled on the device;
  • Calculate the distance (in meters) between two geocoordinates;
  • Calculate the bearing between two geocoordinates;

IMPORTANT:

Version 7.0.0 of the geolocator plugin contains several breaking changes, for a complete overview please have a look at the Breaking changes in 7.0.0 wiki page.

Starting from version 6.0.0 the geocoding features (placemarkFromAddress and placemarkFromCoordinates) are no longer part of the geolocator plugin. We have moved these features to their own plugin: geocoding. This new plugin is an improved version of the old methods.

Usage

To add the geolocator to your Flutter application read the install instructions. Below are some Android and iOS specifics that are required for the geolocator to work correctly.

Upgrade pre 1.12 Android projects

Since version 5.0.0 this plugin is implemented using the Flutter 1.12 Android plugin APIs. Unfortunately this means App developers also need to migrate their Apps to support the new Android infrastructure. You can do so by following the Upgrading pre 1.12 Android projects migration guide. Failing to do so might result in unexpected behaviour.

AndroidX

The geolocator plugin requires the AndroidX version of the Android Support Libraries. This means you need to make sure your Android project supports AndroidX. Detailed instructions can be found here.

The TL;DR version is:

  1. Add the following to your "gradle.properties" file:
android.useAndroidX=true
android.enableJetifier=true
  1. Make sure you set the compileSdkVersion in your "android/app/build.gradle" file to 35:
android {
  compileSdkVersion 35

  ...
}
  1. Make sure you replace all the android. dependencies to their AndroidX counterparts (a full list can be found here: Migrating to AndroidX).

Permissions

On Android you'll need to add the ACCESS_COARSE_LOCATION permission to your Android Manifest, and the ACCESS_FINE_LOCATION permission if your app needs precise location. To do so open the AndroidManifest.xml file (located under android/app/src/main) and add the following line(s) as direct children of the <manifest> tag:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Since Android 12 (API level 31) users can grant only approximate location even when your app requests ACCESS_FINE_LOCATION, so request both permissions together in a single runtime request rather than ACCESS_FINE_LOCATION on its own.

Starting from Android 10 you need to add the ACCESS_BACKGROUND_LOCATION permission (next to the ACCESS_COARSE_LOCATION or the ACCESS_FINE_LOCATION permission) if you want to continue receiving updates even when your App is running in the background:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Starting from Android 14 (SDK 34) the FOREGROUND_SERVICE_LOCATION permission is required to run a foreground service of type location, which this plugin uses to keep delivering updates while your app is in the foreground. The plugin's own manifest already declares it, so it is merged into your app automatically — no action needed on your part.

NOTE: Specifying the ACCESS_COARSE_LOCATION permission results in location updates with an accuracy approximately equivalent to a city block. It might take a long time (minutes) before you will get your first locations fix as ACCESS_COARSE_LOCATION will only use the network services to calculate the position of the device. More information can be found here.

On iOS you'll need to add the following entry to your Info.plist file (located under ios/Runner) in order to access the device's location. Simply open your Info.plist file and add the following (make sure you update the description so it is meaningful in the context of your App):

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>

If you don't need to receive updates when your app is in the background, then add a compiler flag as follows: in XCode, click on Pods, choose the Target 'geolocator_apple', choose Build Settings, in the search box look for 'Preprocessor Macros' then add the BYPASS_PERMISSION_LOCATION_ALWAYS=1 flag. Setting this flag prevents your app from requiring the NSLocationAlwaysAndWhenInUseUsageDescription entry in Info.plist, and avoids questions from Apple when submitting your app.

You can also have the flag set automatically by adding the following to the ios/Podfile of your application:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "geolocator_apple"
      target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'BYPASS_PERMISSION_LOCATION_ALWAYS=1']
      end
    end
  end
end

When your project uses Swift Package Manager (SPM) instead of CocoaPods, set the BYPASS_PERMISSION_LOCATION_ALWAYS environment variable to 1 when building. This defines the same preprocessor macro for the geolocator_apple package:

BYPASS_PERMISSION_LOCATION_ALWAYS=1 flutter build ios

Leaving the variable unset (or 0) keeps the default behavior and requests the "always" authorization.

If you do want to receive updates when your App is in the background (or if you don't bypass the permission request as described above) then you'll need to:

  • Add the Background Modes capability to your XCode project (Project > Signing and Capabilities > "+ Capability" button) and select Location Updates. Be careful with this, you will need to explain in detail to Apple why your App needs this when submitting your App to the AppStore. If Apple isn't satisfied with the explanation your App will be rejected.
  • Add an NSLocationAlwaysAndWhenInUseUsageDescription entry to your Info.plist (use NSLocationAlwaysUsageDescription if you're targeting iOS <11.0)

When using the requestTemporaryFullAccuracy({purposeKey: "YourPurposeKey"}) method, a dictionary should be added to the Info.plist file.

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
  <key>YourPurposeKey</key>
  <string>The example App requires temporary access to the device&apos;s precise location.</string>
</dict>

The second key (in this example called YourPurposeKey) should match the purposeKey that is passed in the requestTemporaryFullAccuracy() method. It is possible to define multiple keys for different features in your app. More information can be found in Apple's documentation.

NOTE: the first time requesting temporary full accuracy access it might take several seconds for the pop-up to show. This is due to the fact that iOS is determining the exact user location which may take several seconds. Unfortunately this is out of our hands.

On iOS 16 and above you need to specify UIBackgroundModes location to receive location updates in the background.

<key>UIBackgroundModes</key>
<array>
  <string>location</string>
</array>

On macOS you'll need to add the following entries to your Info.plist file (located under macOS/Runner) in order to access the device's location. Simply open your Info.plist file and add the following (make sure you update the description so it is meaningfull in the context of your App):

<key>NSLocationUsageDescription</key>
<string>This app needs access to location.</string>

You will also have to add the following entry to the DebugProfile.entitlements and Release.entitlements files. This will declare that your App wants to make use of the device's location services and adds it to the list in the "System Preferences" -> "Security & Privace" -> "Privacy" settings.

<key>com.apple.security.personal-information.location</key>
<true/>

When using the requestTemporaryFullAccuracy({purposeKey: "YourPurposeKey"}) method, a dictionary should be added to the Info.plist file.

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
  <key>YourPurposeKey</key>
  <string>The example App requires temporary access to the device&apos;s precise location.</string>
</dict>

The second key (in this example called YourPurposeKey) should match the purposeKey that is passed in the requestTemporaryFullAccuracy() method. It is possible to define multiple keys for different features in your app. More information can be found in Apple's documentation.

NOTE: the first time requesting temporary full accuracy access it might take several seconds for the pop-up to show. This is due to the fact that macOS is determining the exact user location which may take several seconds. Unfortunately this is out of our hands.

To use the Geolocator plugin on the web you need to be using Flutter 1.20 or higher. Flutter will automatically add the endorsed geolocator_web package to your application when you add the geolocator: ^6.2.0 dependency to your pubspec.yaml.

The following methods of the geolocator API are not supported on the web and will result in a UnsupportedError:

  • getLastKnownPosition({ bool forceAndroidLocationManager = true })
  • openAppSettings()
  • openLocationSettings()
  • getServiceStatusStream()

NOTE

Geolocator Web is available only in secure_contexts (HTTPS). More info about the Geolocator API can be found here.

To use the Geolocator plugin on Windows you need to be using Flutter 2.10 or higher. Flutter will automatically add the endorsed geolocator_windows package to your application when you add the geolocator: ^8.1.0 dependency to your pubspec.yaml.

Example

The code below shows an example on how to acquire the current position of the device, including checking if the location services are enabled and checking / requesting permission to access the position of the device:

import 'package:geolocator/geolocator.dart';

/// Determine the current position of the device.
///
/// When the location services are not enabled or permissions
/// are denied the `Future` will return an error.
Future<Position> _determinePosition() async {
  bool serviceEnabled;
  LocationPermission permission;

  // Test if location services are enabled.
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    // Location services are not enabled don't continue
    // accessing the position and request users of the 
    // App to enable the location services.
    return Future.error('Location services are disabled.');
  }

  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      // Permissions are denied, next time you could try
      // requesting permissions again (this is also where
      // Android's shouldShowRequestPermissionRationale 
      // returned true. According to Android guidelines
      // your App should show an explanatory UI now.
      return Future.error('Location permissions are denied');
    }
  }
  
  if (permission == LocationPermission.deniedForever) {
    // Permissions are denied forever, handle appropriately. 
    return Future.error(
      'Location permissions are permanently denied, we cannot request permissions.');
  } 

  // When we reach here, permissions are granted and we can
  // continue accessing the position of the device.
  return await Geolocator.getCurrentPosition();
}

API

Geolocation

Current location

To query the current location of the device simply make a call to the getCurrentPosition method. You can finetune the results by specifying the following parameters:

  • desiredAccuracy: the accuracy of the location data that your app wants to receive;
  • timeLimit: the maximum amount of time allowed to acquire the current location. When the time limit is passed a TimeoutException will be thrown and the call will be cancelled. By default no limit is configured.
import 'package:geolocator/geolocator.dart';

final LocationSettings locationSettings = LocationSettings(
  accuracy: LocationAccuracy.high,
  distanceFilter: 100,
);

Position position = await Geolocator.getCurrentPosition(locationSettings: locationSettings);

Last known location

To query the last known location retrieved stored on the device you can use the getLastKnownPosition method (note that this can result in a null value when no location details are available):

import 'package:geolocator/geolocator.dart';

Position? position = await Geolocator.getLastKnownPosition();

Listen to location updates

To listen for location changes you can call the getPositionStream to receive stream you can listen to and receive position updates. You can finetune the results by specifying the following parameters:

  • accuracy: the accuracy of the location data that your app wants to receive;
  • distanceFilter: the minimum distance (measured in meters) a device must move horizontally before an update event is generated;
  • timeLimit: the maximum amount of time allowed between location updates. When the time limit is passed a TimeoutException will be thrown and the stream will be cancelled. By default no limit is configured.
import 'package:geolocator/geolocator.dart';

final LocationSettings locationSettings = LocationSettings(
  accuracy: LocationAccuracy.high,
  distanceFilter: 100,
);
StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen(
    (Position? position) {
        print(position == null ? 'Unknown' : '${position.latitude.toString()}, ${position.longitude.toString()}');
    });

Platform specific location settings

In certain situation it is necessary to specify some platform specific settings. This can be accomplished using the platform specific AndroidSettings, AppleSettings and WebSettings classes. When using a platform specific class, the platform specific package must be imported as well. For example:

import 'package:geolocator/geolocator.dart';
import 'package:geolocator_android/geolocator_android.dart';
import 'package:geolocator_android/geolocator_web.dart';
import 'package:geolocator_apple/geolocator_apple.dart';

late LocationSettings locationSettings;

if (defaultTargetPlatform == TargetPlatform.android) {
  locationSettings = AndroidSettings(
      accuracy: LocationAccuracy.high,
      distanceFilter: 100,
      forceLocationManager: true,
      intervalDuration: const Duration(seconds: 10),
      //(Optional) Set foreground notification config to keep the app alive 
      //when going to the background
      foregroundNotificationConfig: const ForegroundNotificationConfig(
        notificationText:
        "Example app will continue to receive your location even when you aren't using it",
        notificationTitle: "Running in Background",
        enableWakeLock: true,
      )
  );
} else if (defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS) {
  locationSettings = AppleSettings(
    accuracy: LocationAccuracy.high,
    activityType: ActivityType.fitness,
    distanceFilter: 100,
    pauseLocationUpdatesAutomatically: true,
    // Only set to true if our app will be started up in the background.
    showBackgroundLocationIndicator: false,
  );
} else if (kIsWeb) {
  locationSettings = WebSettings(
    accuracy: LocationAccuracy.high,
    distanceFilter: 100,
    maximumAge: Duration(minutes: 5),
  );
} else {
  locationSettings = LocationSettings(
    accuracy: LocationAccuracy.high,
    distanceFilter: 100,
  );
}

// supply location settings to getCurrentPosition
Position position = await Geolocator.getCurrentPosition(locationSettings: locationSettings);

// supply location settings to getPositionStream
StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen(
        (Position? position) {
      print(position == null ? 'Unknown' : '${position.latitude.toString()}, ${position.longitude.toString()}');
    });

Location accuracy (Android and iOS 14+ only)

To query if a user enabled Approximate location fetching or Precise location fetching, you can call the Geolocator.getLocationAccuracy() method. This will return a Future<LocationAccuracyStatus>, which when completed contains a LocationAccuracyStatus.reduced if the user has enabled Approximate location fetching or LocationAccuracyStatus.precise if the user has enabled Precise location fetching. On Android, LocationAccuracyStatus.reduced means the app was only granted the ACCESS_COARSE_LOCATION permission. Calling getLocationAccuracy before any location permission has been granted throws a PlatformException with the code PERMISSION_DENIED. On iOS 14 and higher, calling getLocationAccuracy before the user has given permission returns LocationAccuracyStatus.reduced by default. On iOS 13 or below, the method getLocationAccuracy will always return LocationAccuracyStatus.precise, since that is the default value for iOS 13 and below.

import 'package:geolocator/geolocator.dart';

var accuracy = await Geolocator.getLocationAccuracy();

Location service information

To check if location services are enabled you can call the isLocationServiceEnabled method:

import 'package:geolocator/geolocator.dart';

bool isLocationServiceEnabled  = await Geolocator.isLocationServiceEnabled();

To listen for service status changes you can call the getServiceStatusStream. This will return a Stream<ServiceStatus> which can be listened to, to receive location service status updates.

import 'package:geolocator/geolocator.dart';

StreamSubscription<ServiceStatus> serviceStatusStream = Geolocator.getServiceStatusStream().listen(
    (ServiceStatus status) {
        print(status);
    });

Permissions

When using the web platform, the checkPermission method will return the LocationPermission.denied status, when the browser doesn't support the JavaScript Permissions API. Nevertheless, the getCurrentPosition and getPositionStream methods can still be used on the web platform.

If you want to check if the user already granted permissions to acquire the device's location you can make a call to the checkPermission method:

import 'package:geolocator/geolocator.dart';

LocationPermission permission = await Geolocator.checkPermission();

If you want to request permission to access the device's location you can call the requestPermission method:

import 'package:geolocator/geolocator.dart';

LocationPermission permission = await Geolocator.requestPermission();

Possible results from the checkPermission and requestPermission methods are:

Permission Description
denied Permission to access the device's location is denied by the user. You are free to request permission again (this is also the initial permission state).
deniedForever Permission to access the device's location is permanently denied. When requesting permissions the permission dialog will not be shown until the user updates the permission in the App settings.
whileInUse Permission to access the device's location is allowed only while the App is in use.
always Permission to access the device's location is allowed even when the App is running in the background.

Note: Android can only return whileInUse, always or denied when checking permissions. Due to limitations on the Android OS it is not possible to determine if permissions are denied permanently when checking permissions. Using a workaround the geolocator is only able to do so as a result of the requestPermission method. More information can be found in our wiki.

Settings

In some cases it is necessary to ask the user and update their device settings. For example when the user initially permanently denied permissions to access the device's location or if the location services are not enabled (and, on Android, automatic resolution didn't work). In these cases you can use the openAppSettings or openLocationSettings methods to immediately redirect the user to the device's settings page.

On Android the openAppSettings method will redirect the user to the App specific settings where the user can update necessary permissions. The openLocationSettings method will redirect the user to the location settings where the user can enable/ disable the location services.

On iOS we are not allowed to open specific setting pages so both methods will redirect the user to the Settings App from where the user can navigate to the correct settings category to update permissions or enable/ disable the location services.

import 'package:geolocator/geolocator.dart';

await Geolocator.openAppSettings();
await Geolocator.openLocationSettings();

Utility methods

To calculate the distance (in meters) between two geocoordinates you can use the distanceBetween method. The distanceBetween method takes four parameters:

Parameter Type Description
startLatitude double Latitude of the start position
startLongitude double Longitude of the start position
endLatitude double Latitude of the destination position
endLongitude double Longitude of the destination position
import 'package:geolocator/geolocator.dart';

double distanceInMeters = Geolocator.distanceBetween(52.2165157, 6.9437819, 52.3546274, 4.8285838);

If you want to calculate the bearing between two geocoordinates you can use the bearingBetween method. The bearingBetween method also takes four parameters:

Parameter Type Description
startLatitude double Latitude of the start position
startLongitude double Longitude of the start position
endLatitude double Latitude of the destination position
endLongitude double Longitude of the destination position
import 'package:geolocator/geolocator.dart';

double bearing = Geolocator.bearingBetween(52.2165157, 6.9437819, 52.3546274, 4.8285838);

Location accuracy

Android

On Android, the LocationAccuracy enum controls the accuracy of the location data the app wants to receive. It also provides control over the priority given to the location stream. This can be confusing, as a priority of lowest might not return any location, while one might expect it to give the quickest responses. The table below outlines the priority and its meaning per accuracy option:

Location accuracy Android priority Description
lowest PRIORITY_PASSIVE Ensures that no extra power will be used to derive locations. This enforces that the request will act as a passive listener that will only receive "free" locations calculated on behalf of other clients, and no locations will be calculated on behalf of only this request.
low PRIORITY_LOW_POWER Requests a tradeoff that favors low power usage at the possible expense of location accuracy.
medium PRIORITY_BALANCED_POWER_ACCURACY Requests a tradeoff that is balanced between location accuracy and power usage.
high+ PRIORITY_HIGH_ACCURACY Requests a tradeoff that favors highly accurate locations at the possible expense of additional power usage.

iOS

On iOS, the LocationAccuracy enum controls the accuracy of the location data the app wants to receive. It also provides control on the battery consumption of the device: the more detailed data is requested, the larger the impact on the battery consumption. More details can be found on Apple's documentation. The table below shows how the LocationAccuracy values map to the native iOS accuracy settings.

Location accuracy iOS accuracy Description
lowest kCLLocationAccuracyThreeKilometers Accurate to the nearest three kilometers.
low kCLLocationAccuracyKilometer Accurate to the nearest kilometer.
medium kCLLocationAccuracyHundredMeters Accurate to within one hundred meters.
high kCLLocationAccuracyNearestTenMeters Accurate to within ten meters of the desired target.
best kCLLocationAccuracyBest The best level of accuracy available.
bestForNavigation kCLLocationAccuracyBestForNavigation The highest possible accuracy that uses additional sensor data to facilitate navigation apps.

Issues

Please file any issues, bugs or feature requests as an issue on our GitHub page. Commercial support is available, you can contact us at hello@baseflow.com.

Want to contribute

If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please carefully review our contribution guide and send us your pull request.

Author

This Geolocator plugin for Flutter is developed by Baseflow.

Changelog

14.1.2

  • Updates the "Location accuracy" section of the README to describe the Android behaviour of getLocationAccuracy(): it returns LocationAccuracyStatus.reduced when only ACCESS_COARSE_LOCATION is granted, and throws a PlatformException with the code PERMISSION_DENIED when no location permission has been granted. Resolves #1528.

14.1.1

  • Fixes the Android build of the example app by pinning the Kotlin Gradle plugin to 2.4.0 and the Android Gradle Plugin to 9.1.0, matching geolocator_android's example.

14.1.0

  • Updates geolocator_platform_interface to ^4.4.0.
  • Updates geolocator_android to ^5.1.0.

14.0.4

  • Fixes the Android build of the example app by updating the Android Gradle Plugin to 9.0.1 and Gradle to 9.1.0.

14.0.3

  • Updates the following dependencies:
    • geolocator_platform_interface to 4.2.8
    • geolocator_android to 5.0.3
    • geolocator_apple to 2.3.14
    • geolocator_linux to 0.2.6
    • geolocator_web to 4.1.4
    • flutter_lints to 6.0.0

14.0.2

  • Adds section about UIBackgroundModes to the README.
  • Adds Linux as a supported platform to pubspec.

14.0.1

  • Adds section about FOREGROUND_SERVICE_LOCATION to the README.
  • Fixes PlatformException in example app for Android 14 (SDK level 34) and newer by updating manifest permissions.

14.0.0

  • BREAKING CHANGE: for Flutter 3.27.0 and below. Make sure you'll upgrade Flutter to 3.29.0 or above before using this version.
  • Bump flutter_lints to version of afp to 5.0.0
  • Updated geolocator_android dependency to version ^5.0.0

13.0.4

  • Bump flutter_lints to version 5.0.0. Later added: of afp example project.

13.0.3

  • Updates dart sdk to sdk: ^3.5.0
  • Updates example project and fixes analyzer issues

13.0.2

  • Updates dependency on geolocator_apple to version 2.3.8.
  • Migrates Android configuration of example app away from imperative gradle API.

13.0.1

  • Resolves problems when compiling non-web platforms because of illegal reference to dart:js_interop.

13.0.0

  • BREAKING CHANGE: Deprecates getCurrentPosition desiredAccuracy, forceAndroidLocationManager, and timeLimit parameters in favor of supplying a LocationSettings class.
  • Exposes WebSettings from geolocator.
  • Updates dependency on geolocator_web to version 4.1.0
  • Updates dependency on geolocator_android to version 4.3.0
  • Updates dependency on geolocator_apple to version 2.3.7
  • Updates dependency on geolocator_windows to version 0.2.3
  • Updates dependency on geolocator_platform_interface to version 4.2.3

12.0.0

  • BREAKING CHANGE: Updates dependency on geolocator_web to version 4.0.0.

11.1.0

  • Expose AndroidPosition from geolocator.

11.0.0

  • BREAKING CHANGE: Updates dependency on geolocator_web to version 3.0.0.

10.1.1

  • Adds a description to the README on how to add the BYPASS_PERMISSION_LOCATION_ALWAYS preprocessor to bypass the need for adding the NSLocationAlwaysUsageDescription to the Info.plist.

10.1.0

  • Includes altitudeAccuracy and headingAccuracy in Position.

10.0.1

  • Updates documentation for getCurrentPosition(), to clarify the behavior of location accuracy on Android devices.
  • Updates README regarding the plugin interpretation of LocationAccuracy.

10.0.0

  • BREAKING CHANGE: Updates dependency on geolocator_windows to version 0.2.0. This will synchronize default values for Position.altitude, Position.heading and Position.speed with the other platforms.

9.0.2

  • Updated dependency on geolocator_android to version 4.1.3
  • Export AndroidResource class at geolocator/lib/geolocator.dart.at.

9.0.1

  • Migrates to Dart SDK 2.15.0 and Flutter 2.8.0.

9.0.0

IMPORTANT: when updating to version 9.0.0 make sure to also set the compileSdkVersion in the android/app/build.gradle file to 33.

  • Updates dependency on geolocator_android to version 4.0.0;
  • Makes sure the Android example app compiles against Android SDK 33.

8.2.1

  • Fixes repository URL of the package.

8.2.0

  • Adds support to make a foreground service on Android and continue processing location updates when the application is moved into the background.
  • Ensures that the getCurrentPosition takes the supplied accuracy into account.
  • Improves the speed of acquiring the current position on iOS.
  • Added additional option to AppleSettings class to allow the user to configure the background location indicator of CLocationManager.

8.1.1

  • Updated README.md to clarify the use of the geolocator_web package.

8.1.0

  • Endorses the geolocator_windows package.

8.0.5

  • Fix code coverage issues by adding iOS specific test for getCurrentPosition

8.0.4

  • Export ActivityType at geolocator.dart

8.0.3

  • Upgraded the geolocator_platform_interface, geolocator_web, geolocator_apple and geolocator_android packages to the latest versions.

8.0.2

  • Updated README.md to clarify the use of platform specific packages.

8.0.1

  • Fix "forceAndroidLocationManager" for getLastKnownPosition
  • Upgrade geolocator_platform_interface to 3.0.1
  • Upgrade geolocator_web to 2.1.1

8.0.0

  • Removed implicit request for permissions when getting a position.
  • Updated README.md to clarify the use of the Geolocator.checkPermission() method.

7.7.1

  • Update the documentation on permissions in the README.md.

7.7.0

IMPORTANT: when updating to version 7.7.0 make sure to also set the compileSdkVersion in the android/app/build.gradle file to 31.

  • Updated dependency on geolocator_android to version 2.0.0;
  • Make sure the Android example App compiles against Android SDK 31.

7.6.2

  • Migrate Android example App to mavenCentral as jFrog has sunset jCenter (see official announcement for more details);
  • Upgrade Android example App to Gradle 4.1.0 to stay in sync with current stable version of Flutter.

7.6.1

  • Refactored the example app and rollbacked the apple deployment target from 9.0 to 8.0.

7.6.0

  • Make sure the getCurrentPosition method returns the current position and not a cached location which might be wrong (see issue #629). Note that this means that in some cases fetching the current position might take several seconds. If you want to have a fast initial result, call the getLastKnownPosition first and update the position with the result from getCurrentPosition.

7.5.0

  • Added support for macOS Desktop.

7.4.1

  • Updated README.md to include information about using the Geolocator web version in release mode.

7.4.0

  • Moved to fully federated architecture (moved Android and iOS implementations into separate packages, geolocator_android and geolocator_apple respectivily).

7.3.1

  • Android 10 and above: Fixed a bug causing the requestPermission method failing to show a prompt when requesting for background location permission.

7.3.0

  • iOS 14: Users can now request Temporary Precise Location fetching by using the requestTemporaryFullAccuracy() method.

7.2.0+1

  • Fix formatting of the CHANGELOG.md.

7.2.0

  • iOS 14: Users can now query whether they gave permission for Approximate location fetching or Precise location fetching.

7.1.1

  • Resolved a 404 error when clicking on the AndroidX migration link in the README.md.

7.1.0

  • Added the locationServiceStream which fires an event if the location service of the device are disabled/enabled in the Android/iOS notification bar or in the Settings of the device.
  • Updated the geolocator_platform_interface: 2.1.1

7.0.3

  • Android: Throw the ActivityMissingException when requesting permissions while the activity is not available (e.g. when the App is in the background);
  • iOS: Support the NSLocationAlwaysAndWhenInUseUsageDescription key on iOS 11+ (this key replaces the NSLocationAlwaysDescription key which has been marked deprecated).

7.0.2

  • Upgrade to geolocator_platform_interface: 2.0.1

7.0.1

  • Resolved bug when requesting permissions for the web (see issue #673).

7.0.0

This release contains the following breaking changes:

  • Stable release of null safety migration;
  • Checking permissions on Android can no longer result in LocationPermissions.deniedForever. More details can be found in issue #653 and the wiki;
  • Removed deprecated timeInterval parameter from the getPositionStream method;
  • Removed deprecated global methods.

For detailed explanation of all breaking changes checkout the wiki page Breacking changes in 7.0.0.

6.2.1

  • Solve bug causing error when requesting permissions (see issue #673).

6.2.0

  • Added web support.

6.1.14

  • iOS: Look for UIBackgroundModes location instead of having to register a separate EnableBackgroundLocationUpdates key in the Info.plist (see PR #645).

6.1.13

  • Resolve deprecation warnings when building for Android.

6.1.12

  • Added an example on how to access the current position of the device to the README.md (see issue #615).

6.1.11

  • Solve issue on Android which can throw a ConcurrentModificationException when accessing locations simultaneously (see issue #620).

6.1.10

  • Filter false positive notifications on Android indicating location services are not available (see issue #585).

6.1.9

  • Return LocationPermission.always when requesting permission on Android 5.1 and below (see issue #610).

6.1.8+1

  • Fixed Dart formatting issue.

6.1.8

  • Deprecate the timeInterval parameter of the getPositionStream method in favor of the more semantic intervalDuration parameter.

6.1.7

  • Resolved bug on Android where in some situations an IllegalArgumentException occures (see issue #590).

6.1.6

  • Improved the example app to minimize code that is not relevant, and prevent confusions.

6.1.5

  • Android: fixed issue where checkPermission reports permissions are denied when it should report permissions are deniedForever (see #571)

6.1.4+1

  • Hotfix to make sure the CLLocation.speedAccuracy property is only compiled when using Xcode 12 or higher (see #577).

6.1.4

  • When available return the floor on which the devices is located (see #562);
  • When on iOS 10+ return information regarding the speed accuracy.

6.1.3

  • Solves a bug causing less accurate location fixes (see #531).

6.1.2

  • Allow developers to call the getCurrentPosition method while already listening to a position stream (see issue #546);
  • Make sure the position stream is stopped correctly (see issues #485 and #541);
  • Android: fix deprecation warning (see issue #556).

6.1.1

  • Android: throw LocationServiceDisabledException when location services are disabled while listening to the position update stream (see issue #548).

6.1.0

  • Wrapped all global functions to a static class, thus changing the way geolocator methods should be called. (see issue #524);
  • Fix permission issue on Android where permisisons are reported "Denied forever" after selecting "One time" permission (see issue #532);
  • Added more detailed documentation on the LocationServiceDisableException (see issue #519).

6.0.0+4

  • Android: fix crash when multiple permissions requests are make simultaneous (see issue #513).

6.0.0+3

  • Make the bearingBetween and distanceBetween methods directly available from the geolocator package (see issue #496);
  • Android: check if permissions and grant results are available in onRequestPermissionsResult (see issue #511)

6.0.0+2

  • Add the isMocked field to the Position class to indicate if the position is retrieved using the Android MockLocationProvider (see issue #498);
  • Fix IllegalArgumentException on Android when using geolocator together with Firebase Analytics (see issue #503);
  • Fix a crash when denying permissions on iOS while receiving position updates (see issue #497);
  • Suppress warning when building App for Android (see issue #502).

6.0.0+1

  • iOS: fixed issue converting integer to LocationPermission enum;

6.0.0

Complete rebuild of the geolocator plugin. Please note the this version contains breaking changes. The most important changes are:

  • Better support for checking and requesting location permissions;
  • Faster response when requesting location information;
  • Added support to configure a timeout to cancel the position request;
  • On Android the geolocator will now automatically prompt the user to enable the location services when they are disabled;
  • Improved error handling. The geolocator will throw detailed exceptions explaining what went wrong (for example a InvalidPermissionException when you don't have permissions to request the position or the LocationServiceDisabledException when the location services are disabled);
  • Improved documentation, especially regarding the configuration of permissions;
  • IMPORTANT: geocoding features have been moved to their own plugin: geocoding.

6.0.0-rc.4

  • Upgrade to geolocator_platform_interface: 1.0.2

6.0.0-rc.3

  • Fixed a bug where on Android the geolocator handles Activity messages that don't belong to the geolocator.

6.0.0-rc.2+1

  • Fixed a typo causing a runtime exception when switching to the Android LocationManager.

6.0.0-rc.2

  • Add support to force using the Android Location Manager instead of the Android FusedLocationProvider;
  • Improved documentation.

6.0.0-rc.1

Complete rebuild of the geolocator plugin. Please note the this version contains breaking changes. The most important changes are:

  • Better support for checking and requesting location permissions;
  • Positions should be returned quickly;
  • Added support to configure a timeout to cancel the position request;
  • On Android the geolocator will now automatically prompt the user to enable the location services when they are disabled;
  • Improved error handling. The geolocator will throw detailed exceptions explaining what went wrong (for example a InvalidPermissionException when you don't have permissions to request the position or the LocationServiceDisabledException when the location services are disabled).
  • IMPORTANT: geocoding features have been moved to their own plugin: geocoding.

5.3.1

  • Update to google_api_availability: 2.0.4

5.3.0

  • Added unit-tests to guard for breaking API changes;
  • Added support to supply a locale identifier when requesting a placemark using a Position instance;
  • *breaking- Stop hiding parsing exceptions when converting coordinates into an address. Instead of returning null the placemarkFromCoordinates method will now throw and ArgumentError if illegal values are returned (which should never happen).

5.2.1

  • Fixes a bug where Placemark instances where not correctly converted to json (thanks to @efraimrodrigues);
  • Corrected a spelling mistake in the CONTRIBUTING.md file.

5.2.0

  • iOS: keep trying to get the location when a kCLErrorLocationUnknown error is received (as per Apple's documentation);
  • Android: synchronize gradle versions with current stable version of Flutter (1.12.13+hotfix.5).

5.1.5

  • Android: Fixes bug where latitude and longitude are not returned as part of the placemark (thanks to @slightfood).

5.1.4+2

  • Return the heading on iOS correctly.

5.1.4+1

  • Downgrade the "meta" package to version 1.7.0 since pub.dev static code analysis reports errors.

5.1.4

  • Added support for Android 10’s background location permission;
  • Return heading as part of the position on iOS.

5.1.3

  • Added integration with public Bitrise CI project;
  • Fixed two analysis warnings;
  • Fixed a spelling error in docs.

5.1.2

  • Added new method to calculate bearing given two points.

5.1.1+1

  • Reverted the update of the 'meta' plugin as Flutter SDK depends on old version.

5.1.1

  • Updated dependency on 'meta' plugin to latest version.

5.1.0

  • Change geocoding results on Android to return multiple records;
  • Extended the example application;
  • Use the correct permission level enumeration;

Added documentation regarding AndroidX support.

5.0.1

  • Make sure the stream channel is closed when Android activity is destroyed;
  • Allow developers to specify the permission level they want to use when requesting permissions on iOS.

5.0.0

  • Converted the iOS version from Swift to Objective-C, reducing the size of the final binary considerably, as well as solve some compatibility issues with other objective-c based plugins;
  • Fetch geocoding results on a separate thread not to slow down the main thread;
  • Bug fix where the current location could not be determined on non-GPS enabled phones;
  • Update to use latest gradle version.

4.0.3

  • Update to latest version of the Location Permissions plugin to solve a bug when permissions are sometimes not requested.

4.0.2

  • Bug fix on Android which causing the Reply already submitted error;
  • Updated location_permission plugin to version 2.0.0.

4.0.1

  • Updated to latest version of the Location Permissions plugin (1.1.0).

4.0.0

  • Overhauled the permissions system to make sure the plugin only depends on the location API. This means when using this version of the plugin Apple requires only entries for the NSLocationWhenInUseUsageDescription and/ or NSLocationAlwaysUsageDescription in the Info.plist.
  • *breaking- As part of the permission system overhaul, we removed the disabled permission status. To check if the location services are running you should call the isLocationServiceEnabled method. This means you can now also request permissions when the location services are disabled.

3.0.1

  • Updated dependencies on Permission Handler and Google API Availability to remove Kotlin dependency.

3.0.0

  • *breaking- Updated to support AndroidX;
  • Added API method isLocationServiceEnabled to check if location services are enabled or disabled
  • Removed method checkGeolocationStatus (marked deprecated in version 1.6.4);
  • Updated to latest version of Permission Handler plugin to solve some small issues on iOS;
  • Added Swift version number to podspec file;
  • Added ProGuard support for Android;
  • Updated static code analyses to confirm to latest recommendations from Flutter team.

2.1.1

  • Updated iOS code to Swift 4.2
  • Updated to latest version of the permission_handler plugin (v2.1.2)

2.1.0

  • Updated dependencies on Permission Handler and Google API Availability plugins.

2.0.2

  • Updated Gradle version

2.0.1

  • Bug fix where a null reference exception occurs because the timestamp of the Position could be null when fetching a Placemark using the placemarkFromAddress or placemarkFromCoordinates methods.

2.0.0

  • *breaking- The getPositionStream method now directly returns an instance of the Stream<Position> class, meaning there is no need to await the method before being able to access the stream;
  • *breaking- Arguments for the methods getCurrentPosition and getLastKnownPosition are now named optional parameters instead of positional optional parameters;
  • By default Geolocator will use FusedLocationProviderClient on Android when Google Play Services are available. It will fall back to LocationManager when it is not available. You can override the behaviour by setting Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
  • Allow developers to specify a desired interval for active location updates, in milliseconds (Android only).

1.7.0

  • Added timestamp to instances of the Position class indicating when the GPS fix was acquired;
  • Updated the dependency on the PermissionHandler to version >=2.0.0 <3.0.0.

1.6.5

  • Fixed bug on Android when not supplying a locale while using the Geocoding features.

1.6.4

  • Added support to supply a locale when using the placemarkFromAddress and placemarkFromCoordinates methods.
  • Deprecated the static method checkGeolocationStatus in favor of the instance method checkGeolocationPermissionStatus (the static version will be removed in version 2.0 of the Geolocator plugin).

1.6.3

  • Added feature to check the availability of Google Play services on the device (using the checkGooglePlayServicesAvailability method). This will allow developers to implement a more user friendly experience regarding the usage of Google Play services (for more information see the article Set Up Google Play Services);
  • Fixed the error 'List<dynamic>' is not a subtype of type 'Future<dynamic>' on Flutter 0.6.2 and higher (thanks @fawadkhanucp for reporting the issue and solution);
  • Fixed an error when calling the getCurrentPosition, getPositionStream, placemarkFromAddress and placemarkFromCoordinates from an Android background service (thanks @sestegra for reporting the issue and creating a pull-request).

1.6.2

  • Hot fix to solve cast exception

1.6.1

  • Fixed a bug which caused stationary location updates not to be streamed when using the new FusedLocationProviderClient on Android (thanks @audkar for the PR).

1.6.0

  • Use the Location Services (through the FusedLocationProviderClient) on Android if available, otherwise fallback to the LocationManager class;
  • Make sure that on Android the last know location is returned immediately on the stream when requesting location updates through the getPositionStream method;
  • Updated documentation on adding location permissions on Android.

1.5.0

  • It is now possible to check the location permissions using the checkGeolocationStatus method [ISSUE #51].
  • Improved the example App [ISSUE #54]
  • Solved a bug on Android causing a memory leak when you stop listening to the position stream.
  • *breaking- Solved a bug on Android where permissions could be requested more then once simultaneously [ISSUE #58]
  • Solved a bug on Android where requesting permissions twice would cause the App to crash [ISSUE #61]

Important:

To be able to correctly fix issue #58 we had to change the getPositionStream method into a async method. This means the signature of the method has been changed from:

Stream<Position> getPositionStream([LocationOptions locationOptions = const LocationOptions()])

to

Future<Stream<Position>> getPositionStream([LocationOptions locationOptions = const LocationOptions()]).

Meaning as a developer you'll now have to await the result of the method to get access to the actual stream.

1.4.0

  • Added feature to query the last known location that is stored on the device using the getLastKnownLocation method;
  • *breaking- Renamed the getPosition to getCurrentPosition;
  • Fixed bug where calling getCurrentPosition on Android resulted in returning the last known location;
  • *breaking- Renamed methods toPlacemark and fromPlacemark respectively to the, more meaningful names, placemarkFromAddress and placemarkFromCoordinates;

1.3.1

  • Added support for iOS kCLLocationAccurayBestForNavigation (defaults to best when on Android).

1.3.0

  • Added the option to check the distance between two geocoordinates (using the distanceBetween method).

1.2.2

  • Make sure that an Android App using the plugin is informed when the platform stops transmitting location updates.

1.2.1

  • Added feature to throttle the amount of locations updates based on a supplied distance filter.

Important:

This introduces a breaking change since the signature of the getPositionStream has changed from getPositionStream(LocationAccuracy accuracy) to getPositionStream(LocationOptions locationOptions) .

  • Made some small changes to ensure the plugin no longer is depending on JAVA 8, meaning the plugin will run using the default Android configuration.

1.2.0

  • Added support to translate an address into geocoordinates and vice versa (a.k.a. Geocoding). See the README.md file for more information.

1.1.2

  • Fixed reported formatting issues

1.1.1

  • Fixed a warning generated by xCode when compiling the example project (see issue #28)
  • Fixed some warnings generated by Dart static code analyser, improving code quality

1.1.0

  • Introduced the option to supply a desired accuracy.

*Important:-

This introduces a breaking change, the getPosition and onPositionChanged properties have been replaced by methods (getPosition([LocationAccuracy desiredAccuracy = LocationAccuracy.Best]) and getPositionStream([LocationAccuracy desiredAccuracy = LocationAccuracy.Best]) respectively) accepting a parameter to indicate the desired accuracy.

1.0.0

  • Updated documentation
  • API defined stable

0.0.2

  • Solved problem with missing geolocator-Swift.h header file (see also issue Flutter#16049).

0.0.1

  • Initial release

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add geolocator
pubspec.yaml
name: geolocator
description: Geolocation plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API for generic location (GPS etc.) functions.
repository: https://github.com/baseflow/flutter-geolocator/tree/main/geolocator
issue_tracker: https://github.com/baseflow/flutter-geolocator/issues?q=is%3Aissue+is%3Aopen
version: 14.1.2

environment:
  sdk: ^3.5.0
  flutter: ">=2.8.0"

flutter:
  plugin:
    platforms:
      android:
        default_package: geolocator_android
      ios:
        default_package: geolocator_apple
      macos:
        default_package: geolocator_apple
      web:
        default_package: geolocator_web
      windows:
        default_package: geolocator_windows
      linux:
        default_package: geolocator_linux

dependencies:
  flutter:
    sdk: flutter

  geolocator_platform_interface: ^4.4.0
  geolocator_android: ^5.1.0
  geolocator_apple: ^2.3.14
  geolocator_web: ^4.1.4
  geolocator_windows: ^0.2.3
  geolocator_linux: ^0.2.6

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^6.0.0
  mockito: ^5.0.0
  plugin_platform_interface: ^2.1.8

Version history

VersionPublishedArchiveSHA-256
0.0.1On demandDownloadadfccdb6…634d50
0.0.2On demandDownloadeecc1dcc…622536
1.0.0On demandDownloadf3a7d630…fc2d1f
1.1.0On demandDownload96d14a42…172e71
1.1.1On demandDownload145ab375…174e61
1.1.2On demandDownload4bf6c022…3344c9
1.2.0On demandDownload258c3946…a7547d
1.2.1On demandDownload6a9362cb…2bb89b
1.2.2On demandDownloadab8e6566…dbb347
1.3.0On demandDownloadf288d90f…dcce45
1.3.1On demandDownloadfdee2602…d86e75
1.4.0On demandDownloadfb33a34e…556c0b
1.5.0On demandDownloada68623f0…32769b
1.6.0On demandDownload2f06406d…a2b162
1.6.1On demandDownload3c1fa6e8…0d8672
1.6.2On demandDownloadba00a2af…325cb1
1.6.3On demandDownload05223d64…4babcb
1.6.4On demandDownload72371aa6…42a1c8
1.6.5On demandDownload47d7f101…d4eb19
1.7.0On demandDownloadfee80711…563698
2.0.0On demandDownload648f4487…18b7a7
2.0.1On demandDownload770262aa…12bc13
2.0.2On demandDownloade58d9390…5d247e
2.1.0On demandDownload4346a375…64488b
2.1.1On demandDownload5bbf1f54…5657ef
3.0.0On demandDownloadb9baf5a2…024cdd
3.0.1On demandDownload853c6a05…dd9705
4.0.0On demandDownloadf36559fd…e8214e
4.0.1On demandDownload6e219f5f…049c11
4.0.2On demandDownloada6d9e5f3…0c5e7b
4.0.3On demandDownload6459d6a7…8ada03
5.0.0On demandDownload01ef6522…dbd237
5.0.1On demandDownloadcd2786bd…06ee0b
5.1.0On demandDownload4ea13c3c…d80239
5.1.1On demandDownloadb4e67b5d…6b49fc
5.1.1+1On demandDownload12ab1139…7fe385
5.1.2On demandDownload08006bf7…ade1ff
5.1.3On demandDownload9638cf51…807230
5.1.4On demandDownload78b4ece2…97a04d
5.1.4+1On demandDownload63c39274…c29bda
5.1.4+2On demandDownloadfd86c7a9…157657
5.1.5On demandDownload53fe508f…c8171b
5.2.0On demandDownload37b7c475…cab672
5.2.1On demandDownload6bae701d…7da1f5
5.3.0On demandDownload1b8b8fe3…4e7087
5.3.1On demandDownload479a918c…d02e31
5.3.2On demandDownloada4e7f5e9…4c14d7
5.3.2+1On demandDownloadddb761e3…ad3ea4
5.3.2+2On demandDownloaddffcc8ac…36dc44
6.0.0-rc.1On demandDownloadfc92eaa1…6c8c65
6.0.0-rc.2On demandDownloadcbc1c52e…15179a
6.0.0-rc.2+1On demandDownload7628b4c0…59cc18
6.0.0-rc.3On demandDownload1abc357a…984d84
6.0.0-rc.4On demandDownload5501a724…9b8a40
6.0.0On demandDownloade46ddaea…0582ce
6.0.0+1On demandDownloade838a0b5…d30834
6.0.0+2On demandDownload81b57f07…35b381
6.0.0+3On demandDownload7f698573…d4b920
6.0.0+4On demandDownloadb8144e5a…3a11a7
6.1.0On demandDownload2e9b20aa…b633a8
6.1.1On demandDownload83a6099b…ab300b
6.1.2On demandDownload67f26430…806424
6.1.3On demandDownload272a5d27…8fb16a
6.1.4On demandDownloadcbb95253…7cf205
6.1.4+1On demandDownload93657d49…a67750
6.1.5On demandDownload7b790262…c4735e
6.1.6On demandDownloadba1b135e…3960be
6.1.7On demandDownload05b5944a…05bb58
6.1.8On demandDownload28c87c0b…70f109
6.1.8+1On demandDownload808bdc39…cabc8a
6.1.9On demandDownload8e5316cb…94778e
6.1.10On demandDownload7a2b75f4…d3ca8a
6.1.11On demandDownload74e4c1f8…42731a
6.1.12On demandDownload3018f6a3…255fd3
6.1.13On demandDownload7940342d…39b5cd
6.1.14On demandDownload12b5abcb…689bc5
6.2.0On demandDownloadcdd5bdab…f754f0
6.2.1On demandDownload01fed879…84fb40
7.0.0-nullsafety.0On demandDownload3e0e6272…ff6c36
7.0.0-nullsafety.1On demandDownloadba5d4e59…cbe0c4
7.0.0-nullsafety.2On demandDownload585be2e7…414b02
7.0.0-nullsafety.3On demandDownloadf4fa4e9e…c37fef
7.0.0-nullsafety.4On demandDownloadfa214785…656c11
7.0.0-nullsafety.5On demandDownloadbf2b2ea6…a7bdd9
7.0.0-nullsafety.6On demandDownloadfeb67208…d63f85
7.0.0-nullsafety.7On demandDownloaddeb81298…5e8974
7.0.0-nullsafety.8On demandDownload71835c24…694ca6
7.0.0On demandDownloadf6592002…a1dd0d
7.0.1On demandDownload9e0373cb…d77de7
7.0.2On demandDownloadbf8eb01f…0a9298
7.0.3On demandDownloade0669299…604bf9
7.1.0On demandDownloadc4ed5973…8ed53c
7.1.1On demandDownload3560ba4e…2fc754
7.2.0On demandDownloadbcd1f1ee…a24857
7.2.0+1On demandDownload75b5fb3a…2e837b
7.3.0On demandDownload934a17a9…192cc7
7.3.1On demandDownload15bc907f…eca200
7.4.0On demandDownload712f596f…85fe30
7.4.1On demandDownloadd01c9584…0954ae
7.5.0On demandDownload7e064454…94cde5
7.6.0On demandDownload99a2619b…96e18f
7.6.1On demandDownloade54f53fc…4119d6
7.6.2On demandDownloadf6917234…ab1112
7.7.0On demandDownload7309ae8a…bfad16
7.7.1On demandDownloadb8f52025…2e261d
8.0.0On demandDownload8bc94b16…b7bff1
8.0.1On demandDownloadbe1dfb9f…4e2639
8.0.3On demandDownload85bd8005…d2c145
8.0.4On demandDownloade208c7fa…39143a
8.0.5On demandDownload153eeda9…1f38fa
8.1.0On demandDownload1cd7bc82…61412d
8.1.1On demandDownload3a1cbf70…e6d6b9
8.2.0On demandDownload07660f84…6be10a
8.2.1On demandDownload5c496b46…bde02b
9.0.0On demandDownload6a88e7b9…08a456
9.0.1On demandDownload672ba719…25ec4d
9.0.2On demandDownload5c23f361…dde3a8
10.0.0On demandDownload9d6eff11…aa80c7
10.0.1On demandDownload9f1c9a70…f8e1d8
10.1.0On demandDownloade946395f…036f02
10.1.1On demandDownloadf4efb8d3…9520e5
11.0.0On demandDownload694ec58a…b005cd
11.1.0On demandDownload6cb9fb6e…9bad27
12.0.0On demandDownload149876cc…568f1b
13.0.0On demandDownload9e5d5e09…055861
13.0.1On demandDownload0ec58b73…3c1a81
13.0.2On demandDownloadd2ec6632…b7dbe4
13.0.3On demandDownloadafebc912…4f7f28
13.0.4On demandDownloadf62bcd90…9530e2
14.0.0On demandDownloade7ebfa04…93b822
14.0.1On demandDownloadee2212a3…a320dc
14.0.2On demandDownload79939537…357516
14.0.3On demandDownloade146a6d6…fa599f
14.1.0On demandDownloadf711fef4…51e192
14.1.1On demandDownload4e41ad6b…56ada0
14.1.2Cached · Upstream SHA-256 matchedDownload2b3bc0f7…8b8b09

Dependencies

flutter { "sdk": "flutter" }

geolocator_android "^5.1.0"

geolocator_apple "^2.3.14"

geolocator_linux "^0.2.6"

geolocator_platform_interface "^4.4.0"

geolocator_web "^4.1.4"

geolocator_windows "^0.2.3"