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

Flet框架弹出视图时出现重复视图的问题咨询

问题解决:Flet内置返回按钮导致重复视图的问题

问题原因

你的view_pop事件处理函数中,在pop视图后调用了page.go(top_view.route),这会再次触发route_change事件,而route_change里又执行了page.views.append(),相当于在已经回到上一个视图的基础上,又重复添加了一次该视图,导致重复问题。而浏览器的返回按钮是直接操作浏览器历史栈,不会触发这个额外的page.go调用,所以没有问题。

修正方案

1. 修复view_pop函数

移除page.go(top_view.route),仅在pop视图后更新页面即可:

def view_pop(e: ViewPopEvent):
    print("Before pop " + page.views[-1].route)
    page.views.pop()
    print("After pop " + page.views[-1].route)            
    page.update()  # 仅更新页面,无需调用page.go

2. 避免重复添加视图

在route_change中先检查当前最后一个视图的路由是否和目标路由一致,若一致则跳过添加操作:

def route_change(e: RouteChangeEvent):
    print(e.data)
    # 防止重复添加同一路由的视图
    if page.views and page.views[-1].route == e.data:
        return
    
    # 后续match逻辑保持不变...

3. 修正语法错误

原代码中部分ElevatedButton的on_click参数后多了一个括号(如on_click=lambda _:page.go("/")))),需要去掉多余括号以避免语法错误。

完整修正后的代码

from flet import *

def main(page: Page):
    page.title = "Routes Example"
    page.views.clear()
    
    def route_change(e: RouteChangeEvent):
        print(e.data)
        # 避免重复添加同一路由的视图
        if page.views and page.views[-1].route == e.data:
            return
        
        match e.data:
            case "/":
                page.views.append(
                    View(
                        "/",
                        [
                            AppBar(title=Text("Flet app"), bgcolor=colors.SURFACE_VARIANT),
                            Row(
                                controls=[
                                    ElevatedButton("Visit Store", on_click=lambda _: page.go("/store")),
                                    ElevatedButton("Visit Inventory", on_click=lambda _: page.go("/inventory")),
                                    ElevatedButton("Visit Production", on_click=lambda _: page.go("/production")),
                                ],
                            )
                        ],
                    )
                )
                print("change from Root route "+str(len(page.views)))
            case "/inventory":
                page.views.append(
                    View(
                        "/inventory",
                        [
                            AppBar(title=Text("Inventory"), bgcolor=colors.SURFACE_VARIANT),
                            ElevatedButton("Go to Production", on_click=lambda _: page.go("/production")),
                            ElevatedButton("Go Home", on_click=lambda _: page.go("/")),
                        ],
                    )
                )
                print("change from Inv route "+str(len(page.views)))
            case "/store":
                page.views.append(
                    View(
                        "/store",
                        [
                            AppBar(title=Text("Store"), bgcolor=colors.SURFACE_VARIANT),
                            ElevatedButton("Go to Production", on_click=lambda _: page.go("/production")),
                            ElevatedButton("Go to Inventory", on_click=lambda _: page.go("/inventory")),
                            ElevatedButton("Go Home", on_click=lambda _: page.go("/")),
                        ],
                    )
                )
                print("change from Store route "+str(len(page.views)))
            case "/production":
                page.views.append(
                    View(
                        "/production",
                        [
                            AppBar(title=Text("Production"), bgcolor=colors.SURFACE_VARIANT),
                            ElevatedButton("Go Home", on_click=lambda _: page.go("/")),
                        ],
                    )
                )
                print("change from Prod route "+str(len(page.views)))
            
        page.update()
    
    def view_pop(e: ViewPopEvent):
        print("Before pop " + page.views[-1].route)
        page.views.pop()
        print("After pop " + page.views[-1].route)            
        page.update()

    page.on_route_change = route_change
    page.on_view_pop = view_pop
    page.go(page.route)

if __name__ == "__main__":
    app(target=main, view=AppView.WEB_BROWSER)

内容的提问来源于stack exchange,提问作者ZephWyrm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:44:51