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
相关产品推荐
相关产品推荐

