geolocator 2.1.0

  • Example
  • Installing
  • Versions
  • 99

Flutter Geolocator Plugin

pub package

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

BranchBuild Status
developBuild Status
masterBuild Status


  • Get the current location of the device;
  • Get the last known location;
  • Get continuous location updates;
  • Check if location services are enabled on the device;
  • Translate an address to geocoordinates and vice verse (a.k.a. Geocoding);
  • Calculate the distance (in meters) between two geocoordinates;
  • Check the availability of Google Play services (on Android only).


To use this plugin, add geolocator as a dependency in your pubspec.yaml file. For example:

  geolocator: '^2.1.0'

NOTE: There's a known issue with integrating plugins that use Swift into a Flutter project created with the Objective-C template. See issue Flutter#16049 for help on integration.



To query the current location of the device simply make a call to the getCurrentPosition method:

import 'package:geolocator/geolocator.dart';

Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

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(desiredAccuracy: LocationAccuracy.high);

To listen for location changes you can subscribe to the onPositionChanged stream. Supply an instance of the LocationOptions class to configure the desired accuracy and the minimum distance change (in meters) before updates are send to the application.

import 'package:geolocator/geolocator.dart';

var geolocator = Geolocator();
var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);

StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen(
    (Position position) {
        print(_position == null ? 'Unknown' : _position.latitude.toString() + ', ' + _position.longitude.toString());

To check if location services are enabled you can call the checkGeolocationPermissionStatus method. This method returns a value of the GeolocationStatus enum indicating the availability of the location services on the device. Optionally you can specify if you want to test for GeolocationPermission.locationAlways or GeolocationPermission.locationWhenInUse (by default GeolocationPermission.location is used, which checks for either one of the previously mentioned permissions). Example usage:

import 'package:geolocator/geolocator.dart';

GeolocationStatus geolocationStatus  = await Geolocator().checkGeolocationPermissionStatus();

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 forceAndroidLocationManager.

import 'package:geolocator/geolocator.dart';

Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
GeolocationStatus geolocationStatus  = await geolocator.checkGeolocationPermissionStatus();


To translate an address into latitude and longitude coordinates you can use the placemarkFromAddress method:

import 'package:geolocator/geolocator.dart';

List<Placemark> placemark = await Geolocator().placemarkFromAddress("Gronausestraat 710, Enschede");

If you want to translate latitude and longitude coordinates into an address you can use the placemarkFromCoordinates method:

import 'package:geolocator/geolocator.dart';

List<Placemark> placemark = await Geolocator().placemarkFromCoordinates(52.2165157, 6.9437819);

Both the placemarkFromAddress and placemarkFromCoordinates accept an optional localeIdentifier parameter. This paramter can be used to enforce the resulting placemark to be formatted (and translated) according to the specified locale. The localeIdentifier should be formatted using the syntax: [languageCode]_[countryCode]. Use the ISO 639-1 or ISO 639-2 standard for the language code and the 2 letter ISO 3166-1 standard for the country code. Some examples are:

Locale identifierDescription
enAll English speakers (will translate all attributes to English)
en_USEnglish speakers in the United States of America
en_UKEnglish speakers in the United Kingdom
nl_NLDutch speakers in The Netherlands
nl_BEDutch speakers in Belgium

Calculate distance

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

startLatitudedoubleLatitude of the start position
startLongitudedoubleLongitude of the start position
endLatitudedoubleLatitude of the destination position
endLongitudedoubleLongitude of the destination position
import 'package:geolocator/geolocator.dart';

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

See also the example project for a complete implementation.



On Android you'll need to add either the ACCESS_COARSE_LOCATION or the ACCESS_FINE_LOCATION permission to your Android Manifest. Todo so open the AndroidManifest.xml file and one of the following two lines as direct children of the <manifest> tag:

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

NOTE: Specifying the ACCESS_COARSE_LOCATION permission results in location updates with an accuracy approximately equivalant to a city block. More information can be found here.


On iOS you'll need to add the NSLocationWhenInUseUsageDescription to your Info.plist file in order to access the device's location. Simply open your Info.plist file and add the following:

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

If you would like to access the device's location when your App is running in the background, you should also add the NSLocationAlwaysAndWhenInUseUsageDescription (if your App support iOS 10 or earlier you should also add the key NSLocationAlwaysUsageDescription) key to your Info.plist file:

<string>This app needs access to location when in the background.</string>
<string>This app needs access to location when open and in the background.</string>

Location accuracy

The table below outlines the accuracy options per platform:

medium100 - 500m100m
high0 - 100m10m
best0 - 100m~0m
bestForNavigation0 - 100mOptimized for navigation


Please file any issues, bugs or feature request as an issue on our GitHub page.

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.


This Geolocator plugin for Flutter is developed by Baseflow. You can contact us at


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


  • Updated Gradle version


  • 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.


  • 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).


  • 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.


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


  • Added support to supply a locale when using the placemarkFromAddress and placemarkFromCoordinates methods.
  • Depracated 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).


  • 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).


  • Hot fix to solve cast exception


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


  • 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.


  • 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 simultaniously [ISSUE #58]
  • Solved a bug on Android where requesting permissions twice would cause the App to crash [ISSUE #61]


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()])


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.


  • 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 meaningfull names, placemarkFromAddress and placemarkFromCoordinates;


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


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


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


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


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.


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


  • Fixed reported formatting issues


  • 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


  • Introduced the option to supply a desired accuracy.


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.


  • Updated documentation
  • API defined stable


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


  • Initial release


import 'package:flutter/material.dart';

import 'pages/calculate_distance_widget.dart';
import 'pages/current_location_widget.dart';
import 'pages/location_stream_widget.dart';

void main() => runApp(new GeolocatorExampleApp());

enum TabItem { singleLocation, locationStream, distance }

class GeolocatorExampleApp extends StatefulWidget {
  State<GeolocatorExampleApp> createState() => BottomNavigationState();

class BottomNavigationState extends State<GeolocatorExampleApp> {
  TabItem _currentItem = TabItem.singleLocation;

  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Geolocator Example App'),
        body: _buildBody(),
        bottomNavigationBar: _buildBottomNavigationBar(),

  Widget _buildBody() {
    switch (_currentItem) {
      case TabItem.locationStream:
        return LocationStreamWidget();
      case TabItem.distance:
        return CalculateDistanceWidget();
      case TabItem.singleLocation:
        return CurrentLocationWidget();

  Widget _buildBottomNavigationBar() {
    return BottomNavigationBar(
      type: BottomNavigationBarType.fixed,
      items: [
            Icons.location_on, TabItem.singleLocation),
        _buildBottomNavigationBarItem(Icons.clear_all, TabItem.locationStream),
        _buildBottomNavigationBarItem(Icons.redo, TabItem.distance),
      onTap: _onSelectTab,

  BottomNavigationBarItem _buildBottomNavigationBarItem(
      IconData icon, TabItem tabItem) {
    String text = tabItem.toString().split('.').last;
    Color color =
        _currentItem == tabItem ? Theme.of(context).primaryColor : Colors.grey;

    return BottomNavigationBarItem(
      icon: Icon(
        color: color,
      title: Text(
        style: TextStyle(
          color: color,

  void _onSelectTab(int index) {
    TabItem selectedTabItem;

    switch (index) {
      case 1:
        selectedTabItem = TabItem.locationStream;
      case 2:
        selectedTabItem = TabItem.distance;
        selectedTabItem = TabItem.singleLocation;

    setState(() {
      _currentItem = selectedTabItem;

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:

  geolocator: ^2.1.0

2. Install it

You can install packages from the command line:

with Flutter:

$ flutter packages get

Alternatively, your editor might support flutter packages get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:geolocator/geolocator.dart';
Version Uploaded Documentation Archive
2.1.0 Oct 11, 2018 Go to the documentation of geolocator 2.1.0 Download geolocator 2.1.0 archive
2.0.2 Oct 10, 2018 Go to the documentation of geolocator 2.0.2 Download geolocator 2.0.2 archive
2.0.1 Sep 25, 2018 Go to the documentation of geolocator 2.0.1 Download geolocator 2.0.1 archive
2.0.0 Sep 21, 2018 Go to the documentation of geolocator 2.0.0 Download geolocator 2.0.0 archive
1.7.0 Sep 10, 2018 Go to the documentation of geolocator 1.7.0 Download geolocator 1.7.0 archive
1.6.5 Sep 5, 2018 Go to the documentation of geolocator 1.6.5 Download geolocator 1.6.5 archive
1.6.4 Sep 3, 2018 Go to the documentation of geolocator 1.6.4 Download geolocator 1.6.4 archive
1.6.3 Aug 27, 2018 Go to the documentation of geolocator 1.6.3 Download geolocator 1.6.3 archive
1.6.2 Aug 22, 2018 Go to the documentation of geolocator 1.6.2 Download geolocator 1.6.2 archive
1.6.1 Aug 22, 2018 Go to the documentation of geolocator 1.6.1 Download geolocator 1.6.1 archive

All 24 versions...

Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Nov 14, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.0.0
  • pana: 0.12.6
  • Flutter: 0.11.3


Detected platforms: Flutter

References Flutter, and has no conflicting libraries.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.0.0-dev.68.0 <3.0.0
flutter 0.0.0
google_api_availability ^1.0.4 1.0.4
meta ^1.0.5 1.1.6
permission_handler ^2.1.0 2.1.0
Transitive dependencies
collection 1.14.11
sky_engine 0.0.99
typed_data 1.1.6
vector_math 2.0.8
Dev dependencies