近日,广受欢迎的Python GUI框架Flet被曝出现一个严重bug:应用在启动或页面切换时会陷入“永无止境的加载循环”(neverending loading loop),导致界面始终停留在加载状态,无法正常交互。这一漏洞迅速登上GitHub热门议题榜,引发全球开发者高度关注。
背景:Flet为何受追捧
Flet是近年来崛起的Python桌面与Web应用框架,其最大特色是允许开发者用纯Python代码构建功能丰富的用户界面,底层则调用Flutter引擎进行渲染。凭借“写Python,得Flutter体验”的便捷性,Flet在数据科学、快速原型开发、轻量级工具等领域迅速积累了大量用户。截至2025年中,其GitHub星标已超过2万,PyPI月下载量突破百万。
然而,正是这样一个被寄予厚望的框架,如今却因加载循环问题蒙上阴影。
漏洞详情:从启动到崩溃
据多位开发者反馈,触发该bug的场景非常普遍:当应用包含多个页面、或使用了动态加载组件(如Container、WebView)时,Flet客户端会在首次渲染或页面跳转时反复调用update()方法,导致控件状态更新与UI重绘之间形成死循环。用户看到的只有一个转动的加载图标,控制台则不断输出“Rebuilding layout...”“Syncing state...”等日志,直至内存耗尽或手动终止进程。
“我的应用只有两个页面,一个列表页和一个详情页。从详情页返回列表页时,加载动画就永远停不下来了。”一位名为@dev_penguin的开发者晒出代码片段,并注明“已在最新版Flet 0.23.0上复现”。
更令人担忧的是,该bug并非偶发。在Flet官方Issue区,类似问题在短短48小时内累积了200余条评论,涉及Windows、macOS和Linux所有平台。部分用户尝试降级到0.22.x版本,却发现旧版同样受到影响,只是触发频率稍低。
根因分析:异步状态管理的“定时炸弹”
技术社区已开始对漏洞根源进行剖析。有核心贡献者指出,问题可能出在Flet的异步事件循环与Flutter引擎之间的状态同步机制上。当某个控件的on_change回调中再次调用了修改相同控件的属性,且未设置合理的防抖或锁机制,就会造成“状态更新→触发重新布局→布局完成→触发状态更新”的无限递归。
此外,Flet在V0.23.0中引入的“热重载”优化也被怀疑是诱因之一。该特性试图在运行时动态计算控件的最小变更集合,但在复杂页面栈下,计算逻辑可能错误地将“已完成加载”标记清零,导致系统反复判断“需要重新加载”。
社区反应:热修复与临时方案
面对突如其来的漏洞,Flet社区表现出了极高的韧性与协作精神。多位开发者迅速共享了临时Workaround:例如在页面切换前显式销毁旧控件实例、使用weakref避免循环引用、或手动控制update()调用频率。更有激进者直接修改了Flet源码中的渲染循环节流参数。
截至发稿,Flet团队已在GitHub发布紧急声明,确认该bug“与Flutter通道的异步消息队列深度相关”,并承诺将在72小时内推出0.23.1补丁版本。团队同时建议用户暂时避免使用page.go()进行路由跳转,改用page.views操作作为替代。
影响与启示
此次事件对Flet生态的冲击不容小觑。一些依赖Flet的生产级项目被迫暂停部署,教育领域的教学案例也需要临时替换。但另一方面,它也为框架的长期健康发展敲响了警钟:在追求“Python友好”的同时,必须正视底层异步编程的复杂度。毕竟,GUI框架的每一次卡顿,都是对用户信任的消耗。
给开发者的建议
对于正在使用Flet的开发者,建议采取以下措施:
- 立即停止在生产环境使用0.23.0及以上版本;
- 关注官方GitHub Release页面,及时安装修复补丁;
- 在应用中添加全局错误捕获和超时逻辑,防止无限循环导致死机;
- 回顾项目代码,检查是否有在on_change回调中修改自身属性的模式。
正如Flet创始人@feodor2在推特所言:“我们犯了一个基础性错误,但我们会用最快速度修复它。Flet不会停下——但这次,我们得先让它正确地‘停下’。”这也许是此次危机中最诚实也最有力的注脚。
(全文约980字)