flet-webview:在 Flet 应用中嵌入 WebView 的官方扩展及其 0.80.0 演进
发布时间:2026/9/21 18:15:40 作者:尧图编辑部 阅读量:1,286

前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载导读flet-webview 是 Flet 官方维护的扩展包用于在 Flet 应用中通过 WebView 直接展示网页内容。本篇文章以该扩展包 CHANGELOG.md 为脉络完整梳理其从 0.1.0 首发到 0.80.0 的版本演进并结合仓库源码深入讲解 WebView 控件的平台支持、安装方式、核心属性、事件与异步方法最后给出 Android 明文流量cleartext报错的排查方案。读完本文你将能够用纯 Python 在 iOS、Android、macOS 与 Web 平台上嵌入可交互的网页视图并理解其底层基于 webview_flutter 的实现原理。一、版本演进从首发到 0.80.0CHANGELOG.md 记录了 flet-webview 的两个关键版本节点0.1.0Initial release扩展包首次发布提供最基础的WebView控件能力。包元数据位于 pyproject.toml项目描述为“Embed web content inside Flet apps via WebView”依赖仅flet与typing-extensionsPython 3.11 时需要要求 Python 3.10。0.80.0两个重要变更Added部署了在线文档flet.dev/docs/webview/仓库内的对应权威文档即 website/docs/controls/webview/index.md。Changed将所有控件重构为flet.control装饰器加持的 dataclass 风格定义。flet.control重构意味着控件属性不再通过分散的get_/set_方法定义而是统一以类属性dataclass 字段声明由ft.control(WebView)装饰器在背后完成属性注册、序列化与参数映射。这一点可以在 webview.py 中得到直接印证ft.control(WebView) class WebView(ft.LayoutControl): url: Optional[str] None prevent_links: Optional[list[str]] None bgcolor: Optional[ft.ColorValue] None这种声明式风格让每个属性天然携带类型注解与 docstring既便于 IDE 补全也便于 Flet 框架统一生成前端Flutter对应的控件描述是当前 Flet 扩展生态的标准写法。二、平台支持矩阵WebView 控件并非在所有平台可用官方支持情况如下见 README.md 与 官方文档PlatformWindowsmacOSLinuxiOSAndroidWebSupported❌✅❌✅✅✅移动端iOS/Android与 macOS 拥有完整能力导航、JavaScript、缓存、滚动等。Web 平台仅能加载浏览器可在 iframe 中正常渲染的 URL。Windows 与 Linux 暂不支持源码中对应webview_windows_and_linux_vain.dart等文件即为“无效实现”占位。三、安装使用uv或pip均可安装# 使用 uv uv add flet-webview # 使用 pip pip install flet-webview使用 pip 安装后还需手动将该包加入你的requirements.txt或pyproject.toml以便项目依赖可被完整记录。四、快速上手示例仓库自带完整示例 sdk/python/examples/extensions/web_view/web_view/main.py展示了最小可运行用法import flet as ft import flet_webview as fwv def main(page: ft.Page): page.add( ft.SafeArea( expandTrue, contentfwv.WebView( urlhttps://flet.dev, on_page_startedlambda _: print(Page started), on_page_endedlambda _: print(Page ended), on_web_resource_errorlambda e: print(WebView error:, e.data), expandTrue, ), ) ) if __name__ __main__: ft.run(main)要点通过url指定要加载的网页expandTrue让 WebView 撑满可用空间外层用ft.SafeArea避开系统刘海与安全区。事件回调使用 lambda 即可订阅事件数据通过e.data获取。五、WebView 核心属性在 webview.py 中控件公开了以下声明式属性属性类型说明urlOptional[str]要加载的网页 URL。file://本地文件仅在 iOS、Android、macOS 上支持且会连带加载该文件同级的脚本、样式与图片资源在 Web 端仅支持浏览器可在 iframe 中加载的 URLprevent_linksOptional[list[str]]URL 前缀列表命中这些前缀的链接不会被跟随、加载或下载bgcolorOptional[ft.ColorValue]WebView 的背景色六、事件回调WebView 提供以下事件覆盖页面生命周期、资源错误、加载进度、URL 变化、滚动与 JS 交互详见 webview.py事件回调数据支持平台on_page_startedstrURLiOS、Android、macOSon_page_endedstrURLiOS、Android、macOSon_web_resource_errorstr错误信息iOS、Android、macOSon_progressint加载进度iOS、Android、macOSon_url_changestr新 URLiOS、Android、macOSon_scrollWebViewScrollEventx/y 坐标iOS、Androidon_console_messageWebViewConsoleMessageEvent消息与严重级别iOS、Android、macOSon_javascript_alert_dialogWebViewJavaScriptEvent消息与请求方 URLiOS、Android、macOS其中on_progress的进度值是int类型可用于自绘加载进度条on_console_message与on_javascript_alert_dialog是连接前端 JS 世界与 Python 后端的桥梁便于在调试或混合开发场景中拦截页面日志与alert()弹窗。七、异步方法导航、JavaScript 与缓存管理WebView 的所有方法均为async方法必须在async上下文如事件处理器或 async 主函数中await调用。调用前会通过_check_mobile_or_mac_platform()校验平台见 webview.py非 iOS/Android/macOS 平台会抛出ft.FletUnsupportedPlatformException。7.1 导航与历史await webview.reload() # 重新加载当前 URL await webview.go_back() # 历史后退 await webview.go_forward() # 历史前进 can_back await webview.can_go_back() # 是否有后退历史 can_forward await webview.can_go_forward() # 是否有前进历史7.2 页面信息查询current_url await webview.get_current_url() # 当前 URL未加载时为 None title await webview.get_title() # 当前页面标题 ua await webview.get_user_agent() # HTTP User-Agent 请求头值7.3 加载本地文件与 HTML# 加载本地文件绝对路径并使其同级资源可读 await webview.load_file(/path/to/index.html) # 以 GET 请求加载 URL也可指定 POST见 RequestMethod 枚举 await webview.load_request(https://example.com, methodRequestMethod.POST) # 直接加载 HTML 字符串可选 base_url 用于解析相对路径 # base_url 可以是 file:// URL此时引用的本地文件对 WebView 可读 await webview.load_html(h1Hello/h1, base_urlfile:///assets/)7.4 执行 JavaScriptawait webview.run_javascript(document.title)7.5 缩放、滚动与缓存清理await webview.enable_zoom() # 启用屏幕缩放控件与手势 await webview.disable_zoom() # 禁用缩放 await webview.scroll_to(x, y) # 滚动到指定像素坐标 await webview.scroll_by(x, y) # 相对当前滚动位置偏移 await webview.clear_cache() # 清理 HTTP 缓存、Cache API 缓存Service Worker 常用与应用缓存 await webview.clear_local_storage() # 清理 LocalStorage7.6 控制 JavaScript 执行模式from flet_webview import JavaScriptMode await webview.set_javascript_mode(JavaScriptMode.DISABLED)set_javascript_mode用于开启或禁用页面 JavaScript 执行默认值为JavaScriptMode.UNRESTRICTED在首次页面加载前生效。注意禁用 JavaScript 可能导致页面行为异常应谨慎使用。八、枚举与事件类型定义在 types.py 中定义了完整的类型系统RequestMethodHTTP 方法枚举GET与POST用于load_request()。JavaScriptModeJavaScript 支持状态UNRESTRICTED无限制与DISABLED禁用。LogLevelSeverityJS 控制台消息严重级别对应console.error/warn/debug/info/log五种级别用于WebViewConsoleMessageEvent.severity_level。WebViewScrollEvent滚动事件载荷包含x、y浮点坐标原点在 WebView 左上角。WebViewConsoleMessageEvent控制台消息载荷包含message与severity_level。WebViewJavaScriptEventalert()对话框请求载荷包含message与发起请求页面的url。所有这些类型均通过flet_webview/__init__.py对外导出使用import flet_webview as fwv后可直接访问。九、底层实现Flutter 扩展的架构拆解flet-webview 的 Python 层只负责声明控件与参数映射真正的渲染由随包分发的 Flutter 插件完成。从 src/flutter/flet_webview/ 的目录结构可以清晰看到平台分层webview_mobile_and_mac.dartiOS、Android、macOS 的完整实现基于 webview_flutter 包。webview_web.dartWeb 平台实现基于 webview_flutter_webiframe 方案因此只能加载允许被 iframe 嵌入的页面。webview_windows_and_linux.dart 及对应的_vain.dart占位文件Windows/Linux 的“无效实现”运行时按需 fallback这也解释了平台支持矩阵中这两列的 ❌。file_access.dart负责将file://URL 引用的本地资源映射为 WebView 可读的字节流是url/load_file/load_html(base_urlfile://...)能加载本地文件及同级资源的底层支撑。可以推断Python 端每个await webview.xxx()最终都通过_invoke_method序列化为对 Flutter 端同名方法的调用返回值如can_go_back()的布尔结果再反序列化回 Python形成完整的跨语言调用链。十、Android 明文流量报错排查NET::ERR_CLEARTEXT_NOT_PERMITTED在 Android 上若 WebView 加载的页面包含明文未加密HTTP 流量默认会被系统拦截并抛出NET::ERR_CLEARTEXT_NOT_PERMITTED。这是 Android 出于保护用户数据安全的设计。修复方式在应用的打包配置中显式开启 cleartext 流量。在pyproject.toml中加入[tool.flet.android.manifest_application] usesCleartextTraffic true该配置会将android:usesCleartextTraffictrue写入 AndroidManifest 的 application 节点。完整说明参见 官方文档 的 Troubleshooting 一节及 Android 发布文档。注意仅在确实需要访问明文 HTTP 资源时才应开启生产环境建议优先使用 HTTPS。十一、可继续深入阅读的仓库资源控件源码sdk/python/packages/flet-webview/src/flet_webview/webview.py类型与事件定义sdk/python/packages/flet-webview/src/flet_webview/types.py官方文档website/docs/controls/webview/index.md完整示例sdk/python/examples/extensions/web_view/web_view/main.py包元数据与版本sdk/python/packages/flet-webview/pyproject.toml 与 CHANGELOG.mdFlutter 平台实现sdk/python/packages/flet-webview/src/flutter/flet_webview/lib赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐告别复杂前端用Flet WebView组件3步实现应用内网页嵌入告别复杂前端用Flet WebView组件3步实现应用内网页嵌入 你还在为应用开发中的网页展示功能烦恼吗既要懂Python又要学HTML/CSS本文将带你前端跨平台桌面应用移动开发Blender终极四边形重拓扑QRemeshify完整使用指南Blender终极四边形重拓扑QRemeshify完整使用指南 想要在Blender中快速获得专业级四边形网格拓扑吗QRemeshify正是您需要的终极解决前端跨平台桌面应用移动开发Electron-sample-apps WebView 组件在应用中嵌入网页的终极方案Electron sample apps WebView 组件在应用中嵌入网页的终极方案 Electron sample apps 是 GitHub 加速计划上一篇深度解析 mBART-50 多语言机器翻译模型的最新升级下一篇JetKVM WebRTC技术深度剖析构建高效远程访问平台 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考