导航和路由
单页应用程序(SPA)中的导航和路由是组织应用程序用户界面为虚拟页面(视图)并在应用程序 URL 反映当前状态的基本功能。
对于移动应用程序,导航和路由充当深度链接到应用程序特定部分的角色。
添加导航和路由到 Flet 中需要付出更多努力,因为实现基于 Flutter 的 Navigator 2.0 API,並且需要将 Flet 的“Page”抽象替换为“Page 和 View”。 Flutter 的新导航和路由 API 带来了实质性的改进,如:
- 对历史栈的程序化控制。
- 轻松拦截 AppBar 中的“Back”按钮调用。
- 与浏览器历史记录的robust同步。
探索上面的示例代码 。
页面路由
页面路由是应用程序 URL 中的 #
符号后的部分:
默认应用程序路由,如果用户未在应用程序 URL 中设置,则为 /
。所有路由都以 /
开头,例如 /store
、 /authors/1/books/2
。
可以通过读取 page.route
属性来获取应用程序路由,例如:
import flet as ft
def main(page: ft.Page):
page.add(ft.Text(f"初始路由:{page.route}"))
ft.app(target=main, view=ft.AppView.WEB_BROWSER)
获取应用程序 URL,在新浏览器标签页中打开,修改 URL 中的 #
符号后的部分为 /test
,然后按 Enter 键。你应该看到“初始路由:/test”。
每当 URL 中的路由更改(通过编辑 URL 或使用 Back/Forward 按钮浏览历史记录)时,Flet 都会调用 page.on_route_change
事件处理程序:
import flet as ft
def main(page: ft.Page):
page.add(ft.Text(f"初始路由:{page.route}"))
def route_change(e: ft.RouteChangeEvent):
page.add(ft.Text(f"新路由:{e.route}"))
page.on_route_change = route_change
page.update()
ft.app(target=main, view=ft.AppView.WEB_BROWSER)
现在尝试更新 URL 几次,然后使用 Back/Forward 按钮!你应该看到每次路由更改时都添加了一个新消息:
路由可以通过更新 page.route
属性来更改:
import flet as ft
def main(page: ft.Page):
page.add(ft.Text(f"初始路由:{page.route}"))
def route_change(e: ft.RouteChangeEvent):
page.add(ft.Text(f"新路由:{e.route}"))
def go_store(e):
page.route = "/store"
page.update()
page.on_route_change = route_change
page.add(ft.ElevatedButton("Go to Store", on_click=go_store))
ft.app(target=main, view=ft.AppView.WEB_BROWSER)
点击“Go to Store”按钮,你将看到应用程序 URL 更改,并在浏览器历史记录中添加了一个新项。你可以使用浏览器的“Back”按钮来导航回之前的路由。