You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:53:11