如何修复Python3/Flet0.28.3页面切换时的IndexError崩溃问题?
问题:Flet + flet_route 页面切换时频繁崩溃(IndexError)
环境信息
- 系统:MacOS M1
- Python版本:3.12
- Flet版本:0.28.3
- 路由库:flet_route
代码示例
main.py
from flet import * from flet_route import Routing,path from pages.LOGIN import Login from pages.HOME import Home from pages.EDITOR import Editor def main(page:Page): app_routes=[path(url='/',view=Login,clear=True), path(url='/LOGIN',view=Login,clear=True), path(url='/HOME',view=Home,clear=True), path(url='/EDITOR',view=Editor,clear=True)] Routing(page,app_routes) page.go(page.route) app(main,'images')
pages/HOME.py(LOGIN.py、EDITOR.py结构一致)
from flet import * from flet_route import Basket, Params def Home(page:Page,basket:Basket,params:Params): # some code return View('/HOME',controls=[...])
错误日志
Future exception was never retrieved future: <Future finished exception=IndexError('list index out of range')> Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/flet/core/page.py", line 906, in wrapper handler(*args) File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/flet_route/routing.py", line 150, in view_pop top_view = self.page.views[-1] ~~~~~~~~~~~~~~~^^^^ IndexError: list index out of range Future exception was never retrieved future: <Future finished exception=IndexError('pop from empty list')> Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/flet/core/page.py", line 906, in wrapper handler(*args) File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/flet_route/routing.py", line 149, in view_pop self.page.views.pop() IndexError: pop from empty list
解决方案
1. 调整clear参数的使用
所有路由都设置clear=True会导致每次跳转清空整个视图栈,触发回退操作时栈为空就会抛出异常。建议仅给登录页这类不需要保留历史的路由设置clear=True,其他页面改为clear=False:
app_routes=[ path(url='/', view=Login, clear=True), path(url='/LOGIN', view=Login, clear=True), path(url='/HOME', view=Home, clear=False), path(url='/EDITOR', view=Editor, clear=False) ]
2. 初始化时确保视图栈非空
在main函数中,初始化路由前手动添加初始视图,避免启动时栈为空:
def main(page:Page): # 初始化时添加初始视图,防止栈为空 if not page.views: page.views.append(Login(page, Basket(), Params())) app_routes=[ path(url='/', view=Login, clear=True), path(url='/LOGIN', view=Login, clear=True), path(url='/HOME', view=Home, clear=False), path(url='/EDITOR', view=Editor, clear=False) ] Routing(page, app_routes) page.go(page.route)
3. 修复flet_route源码(临时方案)
直接修改flet_route/routing.py中的view_pop方法,添加空栈判断,避免抛出异常:
def view_pop(self, view): # 先判断视图栈是否有内容,再执行pop操作 if len(self.page.views) > 0: self.page.views.pop() if len(self.page.views) > 0: top_view = self.page.views[-1] self.page.go(top_view.route)
4. 避免重复跳转
检查页面跳转逻辑,确保不会短时间内多次调用page.go,防止视图栈操作混乱。比如按钮点击事件中只触发一次跳转。
内容的提问来源于stack exchange,提问作者PyTom
相关产品推荐
相关产品推荐

