主题
帮助你在 Flet 应用中管理运行时权限。
它由 Flutter 的 permission_handler 包提供支持。
平台支持
| 平台 | Windows | macOS | Linux | iOS | Android | Web |
|---|---|---|---|---|---|---|
| 支持 | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
用法
将 flet-permission-handler 添加到项目依赖中:
uv
bash
uv add flet-permission-handlerpip
bash
pip install flet-permission-handler [^1][^1]: 完成上述操作后,你还需要手动将此包添加到你的 requirements.txt 或 pyproject.toml 中。
注意
在移动平台上,你还必须在原生项目文件中声明权限。参见 Flet 发布文档。
环境要求
虽然权限是在运行时才请求的, 但你仍然需要告诉操作系统你的应用可能会用到哪些权限。
Android
参见:
- Android 权限完整列表
Permission枚举,其中列出了所有受支持的权限- 设置 Android 权限
iOS
参见:
Permission枚举,其中列出了所有受支持的权限及其Info.plist键- 设置 iOS 权限
示例
python
import flet as ft
import flet_permission_handler as fph
def main(page: ft.Page):
page.appbar = ft.AppBar(title="PermissionHandler Playground")
def show_snackbar(message: str):
page.show_dialog(ft.SnackBar(ft.Text(message)))
async def get_permission_status(e: ft.Event[ft.OutlinedButton]):
status = await ph.get_status(fph.Permission.MICROPHONE)
show_snackbar(f"Microphone permission status: {status.name}")
async def request_permission(e: ft.Event[ft.OutlinedButton]):
status = await ph.request(fph.Permission.MICROPHONE)
show_snackbar(f"Requested microphone permission: {status.name}")
async def open_app_settings(e: ft.Event[ft.OutlinedButton]):
show_snackbar("Opening app settings...")
await ph.open_app_settings()
ph = fph.PermissionHandler()
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
ft.OutlinedButton("Open app settings", on_click=open_app_settings),
ft.OutlinedButton(
"Request Microphone permission", on_click=request_permission
),
ft.OutlinedButton(
"Get Microphone permission status",
on_click=get_permission_status,
),
],
),
)
)
if __name__ == "__main__":
ft.run(main)描述
PermissionHandler 继承自:ft.Service, BaseControl
管理应用的权限。
平台支持
目前仅在 Android、iOS、Windows 和 Web 平台上受支持。
抛出异常: FletUnsupportedPlatformException:如果平台不受支持。
属性
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
data | Any | skip_ | 任意类型的自定义数据。 |
key | Optional['KeyValue'] | None | 用于在更新之间保持控件标识稳定的键。 |
只读属性
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
parent | Optional['BaseControl'] | — | 此控件的直接祖先(父级)。 默认为 None,只有在此控件被挂载(加入页面树)后才有值。 Page 控件(页面树的根)是个例外 —— 它的 parent 始终为 None。 |
page | 'Page' | — | 此控件所属的页面。 |
方法
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
before_update | — | — | — |
get_status | Optional[PermissionStatus] | — | 获取给定 permission 的当前状态。 参数: permission:要检查状态的 Permission。 返回: 如果状态已知则返回 PermissionStatus,否则返回 None。 |
request | Optional[PermissionStatus] | — | 如果之前尚未授予访问权限,则向用户请求 permission 的访问权限。 参数: permission:要请求的 Permission。 返回: 请求后的新 PermissionStatus;如果请求未成功则返回 None。 |
open_app_settings | bool | — | 打开应用设置页面。 返回: 如果应用设置页面可以打开则返回 True,否则返回 False。 |
init | — | — | — |
is_isolated | — | — | 返回此控件是否被标记为隔离。 隔离控件会被排除在父级驱动的更新遍历之外,并需要自行管理更新边界。 |
build | — | — | 在控件初始化期间调用一次,用于定义其子控件。在此方法中 page 属性可用。 |
before_event | — | — | 在事件处理器执行之前拦截事件。 返回 False 可取消分发。返回 True 或 None 则继续正常的事件处理。 |
did_mount | — | — | 在控件挂载到页面树之后调用。 重写此方法以启动需要已挂载页面的资源,例如订阅、定时器或服务监听器。 |
will_unmount | — | — | 在控件从页面树移除之前调用。 重写此方法以释放 did_mount() 中创建的资源,例如订阅、定时器或外部句柄。 |
get_data_channel | — | — | 解析为此 widget 在 Dart 侧分配的 [DataChannel]。模式: on_data_channel_open: Optional[ft.EventHandler[DataChannelOpenEvent]] = None def init(self): self.on_data_channel_open = self._on_open def _on_open(self, e): self._channel = self.get_data_channel(e.channel_id) 幂等 —— 底层的 Connection 会按 id 缓存 DataChannel,因此重复调用会返回同一实例。没有错误路径:该 id 始终来自框架触发的事件,所以当此方法运行时,通道在两端都已存在。 |
update | None | — | 为此控件请求一次 UI 更新。 在更改控件状态或属性后调用。控件必须已挂载到页面且未被标记为冻结。 |