Flet页面导航问题:点击AppBar菜单跳转Account页面时出现AttributeError
Flet页面导航问题:点击AppBar菜单跳转Account页面时出现AttributeError
看起来你遇到的这个AttributeError是因为Appbar类里的self.page变成了None,没法调用go()方法。我帮你分析下问题所在,再给你解决办法:
问题原因
你的Appbar类继承自Flet的UserControl,在__init__方法里,你先给self.page赋值,然后才调用super().__init__()。但Flet的UserControl基类构造函数会自动把page属性初始化为None,这就把你之前赋值的page对象给覆盖了!所以当点击Account菜单触发account_page方法时,self.page已经是None,自然会报错。
解决方案
调整__init__方法的执行顺序,先调用基类的构造函数,再给self.page赋值:
class Appbar(UserControl): def __init__(self, page) -> None: super().__init__() # 先执行基类构造,避免覆盖自定义属性 self.page = page # 再赋值page对象 def account_page(self, event): self.page.go('/account') # 其他方法保持不变...
额外验证建议
你可以在account_page方法里加一行打印,确认self.page已经正确赋值:
def account_page(self, event): print("当前page对象:", self.page) # 正常应该输出类似<flet.core.page.Page object at ...>的内容 self.page.go('/account')
小优化提示
另外看你的route_change函数,每次路由变化都会先清空views然后添加首页,再追加对应路由的View。其实可以简化成根据当前路由直接构建对应的View列表,逻辑会更清晰:
def route_change(e: RouteChangeEvent) -> None: page.views.clear() if page.route == '/': # 添加首页View page.views.append( View( route='/', controls=[ Text(value='Index-I', size=50, color='white'), IconButton( icon=icons.NAVIGATE_NEXT, icon_color="blue400", icon_size=40, tooltip="Open", on_click=lambda _: page.go('/mainpage')) ], vertical_alignment=MainAxisAlignment.CENTER, horizontal_alignment=CrossAxisAlignment.CENTER, spacing=26, ) ) elif page.route == '/mainpage': # 添加主页面View topnav = appbar.topnav() page.views.append( View( route='/mainpage', controls=[ topnav, FloatingActionButton( icon=icons.ARROW_BACK_IOS_ROUNDED, on_click=lambda _: page.go('/') ), Text( value = 'Analytics', weight = 'BOLD', size=25, text_align = 'CENTER' ), Row([ Text(value = 'BALANCE', size=10), Text(value = '$40 000.00', weight= 'BOLD') ]) ] ) ) elif page.route == '/account': # 添加账户页面View topnav = appbar.topnav() page.views.append( View( route='/account', controls=[ topnav, FloatingActionButton( icon=icons.ARROW_BACK_IOS_ROUNDED, on_click=lambda _: page.go('/') ), Text( value = 'Profile', weight = 'BOLD', size=25, text_align = 'CENTER' ), ] ) ) page.update()
备注:内容来源于stack exchange,提问作者Teddy
相关产品推荐
相关产品推荐

