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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:10:27