前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载PermissionStatus是 Flet 官方扩展包flet-permission-handler中定义的核心枚举类型用于描述运行时权限的六种可能状态已授予、已拒绝、永久拒绝、受限授予、临时授权、系统限制。本文以仓库中该枚举的源码与官方文档为主线逐一解释每种状态的含义、平台差异Android / iOS、底层传递链路并结合PermissionHandler服务给出查询与请求权限的完整实战代码帮助你在纯 Python 的 Flet 应用中正确处理设备权限。PermissionStatus 是什么PermissionStatus定义在 types.py 中是一个继承自Enum的枚举其 docstring 明确说明它用于描述Permission的当前状态class PermissionStatus(Enum): Defines the state of a :class:~flet_permission_handler.Permission.它与同文件中的Permission描述可以检查和请求哪些权限成对出现Permission回答请求什么PermissionStatus回答请求结果 / 当前处于什么状态。二者都通过 __init__.py 的__all__导出因此使用时可以直接写fph.PermissionStatus或fph.Permission。六个枚举成员的字符串值即序列化到 Dart 端、以及从 Dart 端回传的原始值如下表所示枚举成员字符串值核心含义GRANTEDgranted用户已授予该功能访问权DENIEDdenied用户拒绝了访问需要再次请求PERMANENTLY_DENIEDpermanentlyDenied权限被永久拒绝系统不再弹出请求对话框LIMITEDlimited用户仅授予了受限访问目前仅照片选择器相关PROVISIONALprovisional应用被临时授权推送非打扰式通知RESTRICTEDrestricted操作系统层面拒绝访问用户无法自行更改六种状态的详细语义GRANTED已授予GRANTED granted The user granted access to the requested feature. 用户明确授予了应用访问该功能的权限这是最理想的状态。收到GRANTED后即可放心调用对应能力如麦克风、相机、定位。DENIED已拒绝可再次请求DENIED denied The user denied access to the requested feature, permission needs to be asked first. 用户拒绝了访问请求但并未选择不再询问因此应用仍然可以再次弹出请求。官方 docstring 特别强调permission needs to be asked first意味着在拿到DENIED后合理的做法是引导用户重新触发一次request()。PERMANENTLY_DENIED永久拒绝PERMANENTLY_DENIED permanentlyDenied Permission to the requested feature is permanently denied, the permission dialog will not be shown when requesting this permission. The user may still change the permission status in the settings. 这是对用户体验影响最大的一种状态再次调用request()也不会弹出系统对话框。源码 docstring 详细给出了两个平台的触发条件AndroidAndroid 11API 30用户第二次拒绝了该权限Android 11 以下API 30用户拒绝了访问并勾选了不再询问never again show a request。iOS用户拒绝了访问该功能。处理PERMANENTLY_DENIED的正确姿势是调用PermissionHandler.open_app_settings()见后文把用户引导到系统设置页手动打开权限而不是反复请求。LIMITED受限授予LIMITED limited The user has authorized this application for limited access. So far this is only relevant for the Photo Library picker. 用户只授权了有限访问目前仅在照片库选择器Photo Library picker场景下出现——例如 iOS 的照片选择部分照片、Android 14API 34的选择照片和视频Photo Picker 的受限访问模式。平台支持iOS 14 与 Android 14。PROVISIONAL临时授权PROVISIONAL provisional The application is provisionally authorized to post non-interruptive user notifications. 应用被临时授权推送**非打扰式non-interruptive**用户通知——即通知会静默进入通知中心不会发出声音或打断用户。该状态与通知权限Permission.NOTIFICATION相关仅在iOS 12上出现对应 iOS 的 Provisional Authorization 机制。RESTRICTED系统限制RESTRICTED restricted The OS denied access to the requested feature. The user cannot change this apps status, possibly due to active restrictions such as parental controls being in place. 操作系统层面拒绝了访问且用户无法自行更改常见原因是设备上存在家长控制等主动限制策略。该状态仅 iOS 支持。遇到RESTRICTED时应用只能向用户说明限制来自系统/设备管理策略无法通过代码或设置页解决。平台支持与适用前提PermissionStatus各成员并非在所有平台都通用汇总如下依据 types.py docstring状态AndroidiOS关键前提GRANTED/DENIED✅✅通用PERMANENTLY_DENIED✅✅Android 11 为二次拒绝11 以下为勾选不再询问LIMITED✅✅仅 Android 14 与 iOS 14且仅照片库场景PROVISIONAL❌✅仅 iOS 12RESTRICTED❌✅仅 iOS需要提醒的是flet-permission-handler扩展本身目前只支持Android、iOS、Windows 与 Web平台见 PermissionHandler 平台支持 的表格。其中PermissionHandler.before_update()会在 macOS / Linux 上抛出FletUnsupportedPlatformException见 permission_handler.py。因此在桌面端调试时请优先使用 Windows。底层原理状态值如何在 Python 与 Flutter 之间流转PermissionStatus的字符串值并不是随意命名的它对应 Flutter 生态中permission_handler包PermissionStatus枚举的成员名小驼峰写法。流转链路如下Python 侧调用PermissionHandler.get_status()/request()通过_invoke_method把Permission传给 Flutter 端permission_handler.pyFlutter 端在 permission_handler.dart 中调用permission.status/permission.request()得到PermissionStatus后返回value.name如permanentlyDenied、limitedPython 端收到字符串后用PermissionStatus(status)反序列化为枚举成员。从源码看Dart 端的_invokeMethod通过switch分发三个方法名get_status、request、open_app_settings未知方法会抛出Exception(Unknown PermissionHandler method)。parsePermission见 utils/permission_handler.dart会忽略大小写地将传入字符串与 Flutter 的Permission.values匹配匹配失败返回默认值。因此你在 Python 侧看到的status.name如permanentlyDenied与 Flutter 枚举成员名一一对应这也保证了PermissionStatus与上游 Flutter 包的行为完全一致——官方文档明确说明本扩展powered by the Flutter permission_handler packageindex.md。实战查询、请求与处理权限状态安装扩展# 使用 uv uv add flet-permission-handler # 或使用 pip之后需手动把它加入 requirements.txt / pyproject.toml pip install flet-permission-handler在应用中使用官方示例位于 permission_handler/main.py核心代码如下import flet as ft import flet_permission_handler as fph def main(page: ft.Page): page.appbar ft.AppBar(titlePermissionHandler 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(fMicrophone permission status: {status.name}) async def request_permission(e: ft.Event[ft.OutlinedButton]): status await ph.request(fph.Permission.MICROPHONE) show_snackbar(fRequested 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( contentft.Column( controls[ ft.OutlinedButton(Open app settings, on_clickopen_app_settings), ft.OutlinedButton( Request Microphone permission, on_clickrequest_permission ), ft.OutlinedButton( Get Microphone permission status, on_clickget_permission_status, ), ], ), ) ) if __name__ __main__: ft.run(main)PermissionHandler的三个异步方法与PermissionStatus的关系依据 permission_handler.pyasync get_status(permission) - Optional[PermissionStatus]查询某个Permission的当前状态若状态未知如尚未请求过返回Noneasync request(permission) - Optional[PermissionStatus]请求用户授权若之前未被授予返回请求后的新状态请求不成功时返回Noneasync open_app_settings() - bool打开系统设置中该应用的权限设置页返回是否成功打开。状态机式处理建议结合六种状态语义推荐在代码中按如下分支处理request()的返回值status await ph.request(fph.Permission.MICROPHONE) if status is None: # 请求未成功发起例如平台不支持 ... elif status fph.PermissionStatus.GRANTED: # 直接使用麦克风 ... elif status fph.PermissionStatus.DENIED: # 用户拒绝了但还可以再次请求 ... elif status fph.PermissionStatus.PERMANENTLY_DENIED: # 引导去系统设置手动开启 await ph.open_app_settings() elif status fph.PermissionStatus.LIMITED: # 照片库部分选择场景按受限能力处理 ... elif status fph.PermissionStatus.PROVISIONAL: # iOS 12 临时通知授权非打扰式 ... elif status fph.PermissionStatus.RESTRICTED: # iOS 系统限制如家长控制提示用户无法更改 ...与 Permission 枚举的配合使用PermissionStatus的操作对象是Permission枚举二者在 types.py 中成对定义。Permission覆盖了相机、麦克风、定位前台/后台、照片读 / 仅添加、联系人、通知、蓝牙、日历、传感器、短信、存储等数十种设备能力并标注了各自的平台与 API 级别前提如AUDIO仅 Android 13、BLUETOOTH_SCAN仅 Android 12、APP_TRACKING_TRANSPARENCY仅 iOS 等。完整的枚举清单可查阅 Permission 枚举文档。另外请注意在 Android 13API 33及以上Permission.STORAGE已废弃并始终返回DENIED应改用PHOTOS、VIDEOS、AUDIO或MANAGE_EXTERNAL_STORAGE源码 docstring 中明确说明。这提醒我们拿到状态后还应结合Permission成员本身的平台说明一起判断才能写出跨版本正确的逻辑。移动端部署前的权限声明运行时请求权限的同时仍需在原生工程中向操作系统声明应用可能用到的权限Android在 AndroidManifest 中声明对应权限参考 Android 发布文档的权限章节Permission枚举中标注了各成员所需的 API 级别iOS在 Info.plist 中配置对应的使用描述键如相机、定位、照片等Permission枚举的 docstring 中标注了对应的平台键。否则即使代码逻辑正确移动端也拿不到真实的权限状态。桌面端Windows与 Web 端不涉及此类原生声明但 Web 端权限能力受浏览器限制。小结PermissionStatus是flet-permission-handler的状态语言GRANTED/DENIED/PERMANENTLY_DENIED/LIMITED/PROVISIONAL/RESTRICTED六种状态覆盖了主流移动平台上权限的完整生命周期。理解每种状态的平台触发条件尤其是 Android 11 与 iOS 14 / 12 的差异并配合get_status、request、open_app_settings三个方法编排用户流程就能用纯 Python 写出体验良好的权限管理逻辑。其状态值与 Flutterpermission_handler一一对应也意味着你过去在 Flutter 生态中积累的权限处理经验可以直接迁移到 Flet 应用里。赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐flet-permission-handler 使用指南在 Flet 应用中管理设备运行时权限flet permission handler 使用指南在 Flet 应用中管理设备运行时权限 flet permission handler 是 Flet前端跨平台桌面应用移动开发flet-permission-handler在 Flet 应用中优雅管理运行时权限PermissionHandler 完整指南flet permission handler在 Flet 应用中优雅管理运行时权限PermissionHandler 完整指南 导读 本文围绕 Flet前端跨平台桌面应用移动开发Neo-Async 并发控制终极指南用 eachLimit/mapLimit 掌控并发数Neo Async 并发控制终极指南用 eachLimit/mapLimit 掌控并发数 Neo Async 是一个比 Async 更快的并发控制库几乎完整上一篇KeyDB数据持久化RocksDB压缩算法与配置优化下一篇高并发场景下jemalloc线程私有arena配置终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
