Skip to content

Geolocator#

Access device location services in your Flet app using the flet-geolocator extension. The control wraps Flutter's geolocator package and exposes async helpers for permission checks and position streams.

Platform Support#

Platform Windows macOS Linux iOS Android Web
Supported

Usage#

Add flet-geolocator to your project dependencies:

uv add flet-geolocator
pip install flet-geolocator  # (1)!
  1. After this, you will have to manually add this package to your requirements.txt or pyproject.toml.

Important

Request permissions with request_permission or get_permission_status before relying on location data.

Example#

from typing import Callable

import flet_geolocator as ftg

import flet as ft


async def main(page: ft.Page):
    page.scroll = ft.ScrollMode.ADAPTIVE
    page.appbar = ft.AppBar(title=ft.Text("Geolocator Tests"))

    def handle_position_change(e: ftg.GeolocatorPositionChangeEvent):
        page.add(ft.Text(f"New position: {e.position.latitude} {e.position.longitude}"))

    def get_dialog(handler: Callable):
        return ft.AlertDialog(
            adaptive=True,
            title="Opening Location Settings...",
            content=ft.Text(
                "You are about to be redirected to the location/app settings. "
                "Please locate this app and grant it location permissions."
            ),
            actions=[ft.TextButton("Take me there", on_click=handler)],
            actions_alignment=ft.MainAxisAlignment.CENTER,
        )

    def show_snackbar(message):
        page.show_dialog(ft.SnackBar(ft.Text(message)))

    async def handle_permission_request(e: ft.Event[ft.OutlinedButton]):
        p = await geo.request_permission(timeout=60)
        page.add(ft.Text(f"request_permission: {p}"))
        show_snackbar(f"Permission request sent: {p}")

    async def handle_get_permission_status(e: ft.Event[ft.OutlinedButton]):
        p = await geo.get_permission_status()
        show_snackbar(f"Permission status: {p}")

    async def handle_get_current_position(e: ft.Event[ft.OutlinedButton]):
        p = await geo.get_current_position()
        show_snackbar(f"Current position: ({p.latitude}, {p.longitude})")

    async def handle_get_last_known_position(e):
        p = await geo.get_last_known_position()
        show_snackbar(f"Last known position: ({p.latitude}, {p.longitude})")

    async def handle_location_service_enabled(e):
        p = await geo.is_location_service_enabled()
        show_snackbar(f"Location service enabled: {p}")

    async def handle_open_location_settings(e: ft.Event[ft.OutlinedButton]):
        p = await geo.open_location_settings()
        page.pop_dialog()
        if p is True:
            show_snackbar("Location settings opened successfully.")
        else:
            show_snackbar("Location settings could not be opened.")

    async def handle_open_app_settings(e: ft.Event[ft.OutlinedButton]):
        p = await geo.open_app_settings()
        page.pop_dialog()
        if p:
            show_snackbar("App settings opened successfully.")
        else:
            show_snackbar("App settings could not be opened.")

    location_settings_dlg = get_dialog(handle_open_location_settings)
    app_settings_dlg = get_dialog(handle_open_app_settings)

    geo = ftg.Geolocator(
        configuration=ftg.GeolocatorConfiguration(
            accuracy=ftg.GeolocatorPositionAccuracy.LOW
        ),
        on_position_change=handle_position_change,
        on_error=lambda e: page.add(ft.Text(f"Error: {e.data}")),
    )

    page.add(
        ft.Row(
            wrap=True,
            controls=[
                ft.OutlinedButton(
                    content="Request Permission",
                    on_click=handle_permission_request,
                ),
                ft.OutlinedButton(
                    content="Get Permission Status",
                    on_click=handle_get_permission_status,
                ),
                ft.OutlinedButton(
                    content="Get Current Position",
                    on_click=handle_get_current_position,
                ),
                ft.OutlinedButton(
                    content="Get Last Known Position",
                    visible=not page.web,
                    on_click=handle_get_last_known_position,
                ),
                ft.OutlinedButton(
                    content="Is Location Service Enabled",
                    on_click=handle_location_service_enabled,
                ),
                ft.OutlinedButton(
                    content="Open Location Settings",
                    visible=not page.web,  # (1)!
                    on_click=lambda e: page.show_dialog(location_settings_dlg),
                ),
                ft.OutlinedButton(
                    content="Open App Settings",
                    visible=not page.web,  # (1)!
                    on_click=lambda e: page.show_dialog(app_settings_dlg),
                ),
            ],
        )
    )


ft.run(main)

Description#

Inherits: Service

A control that allows you to fetch GPS data from your device.

Properties

Events

Methods

Properties#

configuration class-attribute instance-attribute #

configuration: GeolocatorConfiguration | None = None

Some additional configuration.

position class-attribute instance-attribute #

position: GeolocatorPosition | None = field(
    default=None, init=False
)

The current position of the device. (read-only)

Starts as None and will be updated when the position changes.

Events#

on_error class-attribute instance-attribute #

on_error: ControlEventHandler[Geolocator] | None = None

Fires when an error occurs.

The data property of the event handler argument contains information on the error.

on_position_change class-attribute instance-attribute #

on_position_change: (
    EventHandler[GeolocatorPositionChangeEvent] | None
) = None

Fires when the position of the device changes.

Methods#

distance_between async #

distance_between(
    start_latitude: Number,
    start_longitude: Number,
    end_latitude: Number,
    end_longitude: Number,
) -> Number

Calculates the distance between the supplied coordinates in meters.

The distance between the coordinates is calculated using the Haversine formula (see https://en.wikipedia.org/wiki/Haversine_formula).

Parameters:

  • start_latitude (Number) –

    The latitude of the starting point, in degrees.

  • start_longitude (Number) –

    The longitude of the starting point, in degrees.

  • end_latitude (Number) –

    The latitude of the ending point, in degrees.

  • end_longitude (Number) –

    The longitude of the ending point, in degrees.

Returns:

  • Number

    The distance between the coordinates in meters.

get_current_position async #

get_current_position(
    configuration: GeolocatorConfiguration | None = None,
) -> GeolocatorPosition

Gets the current position of the device with the desired accuracy and settings.

Note

Depending on the availability of different location services, this can take several seconds. It is recommended to call the get_last_known_position method first to receive a known/cached position and update it with the result of the get_current_position method.

Parameters:

Returns:

get_last_known_position async #

get_last_known_position() -> GeolocatorPosition

Gets the last known position stored on the user's device. The accuracy can be defined using the Geolocator.configuration property.

Note

This method is not supported on web platform.

Returns:

Raises:

  • FletUnsupportedPlatformException

    If invoked on a web platform.

get_permission_status async #

get_permission_status() -> GeolocatorPermissionStatus

Gets which permission the app has been granted to access the device's location.

Returns:

is_location_service_enabled async #

is_location_service_enabled() -> bool

Checks if location service is enabled.

Returns:

  • bool

    True if location service is enabled, False otherwise.

open_app_settings async #

open_app_settings() -> bool

Attempts to open the app's settings.

Note

This method is not supported on web platform.

Returns:

  • bool

    True if the app's settings were opened successfully, False otherwise.

Raises:

  • FletUnsupportedPlatformException

    If invoked on a web platform.

open_location_settings async #

open_location_settings() -> bool

Attempts to open the device's location settings.

Note

This method is not supported on web platform.

Returns:

  • bool

    True if the device's settings were opened successfully, False otherwise.

Raises:

  • FletUnsupportedPlatformException

    If invoked on a web platform.

request_permission async #

request_permission() -> GeolocatorPermissionStatus

Requests the device for access to the device's location.

Returns: