跳到主要内容

Geolocator 地理位置

Geolocator 从设备 GPS 获取位置信息。支持 macOS、Windows、iOS、Android 和 web。 基于 geolocator Dart/Flutter 包。

Geolocator 控件是非视觉控件,应该添加到 page.overlay 列表中。

打包

要构建使用 Geolocator 控件的 Flet 应用程序,请在 flet build 命令中添加 --include-packages flet_geolocator,例如:

flet build apk --include-packages flet_geolocator

示例

基本示例

import flet as ft


async def main(page: ft.Page):
page.scroll = ft.ScrollMode.ADAPTIVE
page.appbar = ft.AppBar(title=ft.Text("地理定位器测试"))

def handle_position_change(e):
page.add(ft.Text(f"新位置: {e.latitude} {e.longitude}"))

gl = ft.Geolocator(
location_settings=ft.GeolocatorSettings(
accuracy=ft.GeolocatorPositionAccuracy.LOW
),
on_position_change=handle_position_change,
on_error=lambda e: page.add(ft.Text(f"错误: {e.data}")),
)
page.overlay.append(gl)

settings_dlg = lambda handler: ft.AlertDialog(
adaptive=True,
title=ft.Text("正在打开位置设置..."),
content=ft.Text(
"您即将被重定向到位置/应用设置。请找到此应用并授予其位置权限。"
),
actions=[ft.TextButton(text="带我去那里", on_click=handler)],
actions_alignment=ft.MainAxisAlignment.CENTER,
)

async def handle_permission_request(e):
p = await gl.request_permission_async(wait_timeout=60)
page.add(ft.Text(f"请求权限: {p}"))

async def handle_get_permission_status(e):
p = await gl.get_permission_status_async()
page.add(ft.Text(f"获取权限状态: {p}"))

async def handle_get_current_position(e):
p = await gl.get_current_position_async()
page.add(ft.Text(f"获取当前位置: ({p.latitude}, {p.longitude})"))

async def handle_get_last_known_position(e):
p = await gl.get_last_known_position_async()
page.add(ft.Text(f"获取最后已知位置: ({p.latitude}, {p.longitude})"))

async def handle_location_service_enabled(e):
p = await gl.is_location_service_enabled_async()
page.add(ft.Text(f"位置服务是否启用: {p}"))

async def handle_open_location_settings(e):
p = await gl.open_location_settings_async()
page.close(location_settings_dlg)
page.add(ft.Text(f"打开位置设置: {p}"))

async def handle_open_app_settings(e):
p = await gl.open_app_settings_async()
page.close(app_settings_dlg)
page.add(ft.Text(f"打开应用设置: {p}"))

location_settings_dlg = settings_dlg(handle_open_location_settings)
app_settings_dlg = settings_dlg(handle_open_app_settings)

page.add(
ft.Row(
wrap=True,
controls=[
ft.OutlinedButton(
"请求权限",
on_click=handle_permission_request,
),
ft.OutlinedButton(
"获取权限状态",
on_click=handle_get_permission_status,
),
ft.OutlinedButton(
"获取当前位置",
on_click=handle_get_current_position,
),
ft.OutlinedButton(
"获取最后已知位置",
visible=False if page.web else True,
on_click=handle_get_last_known_position,
),
ft.OutlinedButton(
"位置服务是否启用",
on_click=handle_location_service_enabled,
),
ft.OutlinedButton(
"打开位置设置",
visible=False if page.web else True,
on_click=lambda e: page.open(location_settings_dlg),
),
ft.OutlinedButton(
"打开应用设置",
visible=False if page.web else True,
on_click=lambda e: page.open(app_settings_dlg),
),
],
)
)


ft.app(main)

属性

location_settings

值的类型为 GeolocatorSettings

方法

get_current_position(accuracy, location_settings)

使用所需的精度和设置获取设备的当前位置。

此方法具有以下属性:

返回类型为 GeolocatorPosition 的实例。

注意:根据不同位置服务的可用性,这可能需要几秒钟。建议先调用 get_last_known_position() 方法以接收已知/缓存的位置,然后使用 get_current_position() 的结果进行更新。

get_last_known_position()

使用指定的精度获取设备的最后已知位置。精度可以使用 location_settings 属性进行定义。

返回类型为 GeolocatorPosition 的实例。

get_permission_status()

获取应用被授予访问设备位置的权限。

返回类型为 GeolocatorPermissionStatus 的实例。

request_permission()

请求设备访问设备的位置。

返回类型为 GeolocatorPermissionStatus 的实例。

is_location_service_enabled()

检查位置服务是否启用。

返回一个布尔值:如果位置服务已启用,则为 True,否则为 False

open_app_settings()

尝试打开设备的应用设置。

返回一个布尔值:如果设备的设置已成功打开,则为 True,否则为 False

open_location_settings()

尝试打开设备的位置设置。

返回一个布尔值:如果设备的设置已成功打开,则为 True,否则为 False

事件

on_error

当发生错误时触发。

on_position_change

当设备的位置发生变化时触发。事件处理程序的参数是类型为 GeolocatorPositionChangeEvent 的实例。

get_permission_status()

获取应用程序获取设备位置的权限状态。

返回类型为 GeolocatorPermissionStatus 的实例。

request_permission()

请求设备获取位置权限。

返回类型为 GeolocatorPermissionStatus 的实例。

is_location_service_enabled()

检查位置服务是否启用。

返回一个布尔值:True 如果位置服务启用,False 否则。

open_app_settings()

尝试打开设备的应用程序设置。

返回一个布尔值:True 如果设备的设置成功打开,False 否则。

open_location_settings()

尝试打开设备的位置设置。

返回一个布尔值:True 如果设备的设置成功打开,False 否则。

事件

on_error

当发生错误时触发。

on_position_change

当设备位置发生变化时触发。