Skip to content

帮助你在 Flet 应用中管理运行时权限。

它由 Flutter 的 permission_handler 包提供支持。

平台支持 ​

平台WindowsmacOSLinuxiOSAndroidWeb
支持✅❌❌✅✅✅

用法 ​

将 flet-permission-handler 添加到项目依赖中:

uv

bash
uv add flet-permission-handler

pip

bash
pip install flet-permission-handler  [^1]

[^1]: 完成上述操作后,你还需要手动将此包添加到你的 requirements.txt 或 pyproject.toml 中。

注意

在移动平台上,你还必须在原生项目文件中声明权限。参见 Flet 发布文档。

环境要求 ​

虽然权限是在运行时才请求的, 但你仍然需要告诉操作系统你的应用可能会用到哪些权限。

Android ​

参见:

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:如果平台不受支持。

属性 ​

名称类型默认值说明
dataAnyskip_任意类型的自定义数据。
keyOptional['KeyValue']None用于在更新之间保持控件标识稳定的键。

只读属性 ​

名称类型默认值说明
parentOptional['BaseControl']—此控件的直接祖先(父级)。 默认为 None,只有在此控件被挂载(加入页面树)后才有值。 Page 控件(页面树的根)是个例外 —— 它的 parent 始终为 None。
page'Page'—此控件所属的页面。

方法 ​

名称类型默认值说明
before_update———
get_statusOptional[PermissionStatus]—获取给定 permission 的当前状态。 参数: permission:要检查状态的 Permission。 返回: 如果状态已知则返回 PermissionStatus,否则返回 None。
requestOptional[PermissionStatus]—如果之前尚未授予访问权限,则向用户请求 permission 的访问权限。 参数: permission:要请求的 Permission。 返回: 请求后的新 PermissionStatus;如果请求未成功则返回 None。
open_app_settingsbool—打开应用设置页面。 返回: 如果应用设置页面可以打开则返回 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 始终来自框架触发的事件,所以当此方法运行时,通道在两端都已存在。
updateNone—为此控件请求一次 UI 更新。 在更改控件状态或属性后调用。控件必须已挂载到页面且未被标记为冻结。

关注我,学习大模型、大数据、Python等热门技术。