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

Flet NavigationDrawer无法打开,触发AssertionError异常求助

Flet NavigationDrawer 打开异常问题解决

问题分析

你遇到的两个问题根源在于对Flet中NavigationDrawer的打开方式理解有误,以及页面更新时机的问题:

  • page.open(drawer) 方法是用于打开对话框(如AlertDialog)的,并非NavigationDrawer的正确打开方式,所以会触发AssertionError: Control must be added to the page first错误,即便你已经设置了page.drawer = drawer
  • 直接设置page.drawer.open = True后不显示,是因为没有调用page.update()来刷新页面状态

解决方案

1. 修正抽屉打开逻辑

将show_drawer函数改为直接操作page.drawer的open状态,并调用page.update()刷新:

def show_drawer(e):
    page.drawer.open = True
    page.update()

2. 确保AppBar正确配置

需要将汉堡按钮添加到AppBar的leading位置,保证页面结构完整:

page.appbar = ft.AppBar(
    leading=hamburger_btn,
    title=ft.Text("本地便民服务"),
    bgcolor=ft.colors.SURFACE_VARIANT,
)

3. 调整代码执行顺序

确保page.drawer和page.appbar的赋值在page.update()和page.go()之前完成,保证页面初始化时就能正确识别抽屉组件。

修改后的完整代码示例

import flet as ft

def main(page: ft.Page):
    page.title = "本地便民服务"

    # 抽屉导航切换逻辑
    def handle_change(e):
        selected_index = e.control.selected_index
        routes = ["/", "/notizie", "/differenziata"]
        if selected_index < len(routes):
            page.go(routes[selected_index])
        page.drawer.open = False
        page.update()

    # 路由切换逻辑
    def route_change(e):
        page.views.clear()
        page.views.append(ft.View("/", [ft.Text("首页")]))
        if page.route == "/notizie":
            page.views.append(ft.View("/notizie", [ft.Text("新闻页面")]))
        elif page.route == "/differenziata":
            page.views.append(ft.View("/differenziata", [ft.Text("垃圾分类页面")]))
        page.update()

    def view_pop(view):
        page.views.pop()
        top_view = page.views[-1]
        page.go(top_view.route)

    # 创建NavigationDrawer
    drawer = ft.NavigationDrawer(
        on_change=handle_change,
        controls=[
            ft.Container(height=12),
            ft.NavigationDrawerDestination(
                label="Home",
                icon=ft.icons.HOME,
                selected_icon_content=ft.Icon(ft.icons.HOME_FILLED),
            ),
            ft.Divider(thickness=2),
            ft.NavigationDrawerDestination(
                icon_content=ft.Icon(ft.icons.NEWSPAPER),
                label="Notizie",
                selected_icon=ft.icons.NEWSPAPER_OUTLINED,
            ),
            ft.NavigationDrawerDestination(
                icon_content=ft.Icon(ft.icons.RECYCLING),
                label="Differenziata",
                selected_icon=ft.icons.RECYCLING_OUTLINED,
            )
        ]
    )

    # 打开抽屉的函数
    def show_drawer(e):
        page.drawer.open = True
        page.update()

    # 创建汉堡按钮
    hamburger_btn = ft.IconButton(
        icon=ft.icons.MENU,
        on_click=show_drawer
    )

    # 设置页面抽屉和AppBar
    page.drawer = drawer
    page.appbar = ft.AppBar(
        leading=hamburger_btn,
        title=ft.Text("本地便民服务"),
        bgcolor=ft.colors.SURFACE_VARIANT,
    )

    # 绑定路由事件
    page.on_route_change = route_change
    page.on_view_pop = view_pop

    # 初始化页面
    page.update()
    page.go(page.route)

if __name__ == "__main__":
    ft.app(target=main)

关键说明

  • NavigationDrawer的打开/关闭需要通过page.drawer.open属性控制,操作后必须调用page.update()才能生效
  • page.open()方法仅适用于对话框类组件(如AlertDialog、BottomSheet等),不要用于NavigationDrawer
  • 确保所有页面组件(drawer、appbar)的配置在page.update()之前完成,保证初始化时组件已被正确添加到页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:16:19