使用基于路径的路由,轻松维护 SwiftUI 应用的导航。
通过 SwiftUI Router,你可以使用基于路径的路由来驱动你的 SwiftUI 应用。通过利用基于路径的系统,你的应用中的导航将变得更灵活且更易于维护。
NavigationStack。这提供了一个与 SwiftUI Router 类似的工作流程,并且是类型安全的。但是,两者之间存在一些关键差异。建议在你的项目中使用 SwiftUI Router 之前先试用 NavigationStack。
在 Xcode 中,通过 *File > Add Packages > Search or Enter Package URL* 将依赖项添加到你的项目中,并使用以下 URL
https://github.com/frzi/SwiftUIRouter.git
添加完成后,在你的代码中导入该包
import SwiftUIRouter
万事俱备,只欠东风!
以下是可用视图和对象及其基本功能的快速概述。有关更多详细信息,请查看 Swift 文件中的文档。
Router {
RootView()
}
路由环境的入口。将你的整个应用(或仅需要路由的部分)包装在 Router 中。此视图将初始化路由所需的所有必要环境值。
Route("news/*") {
NewsScreen()
}
Route("settings") {
SettingsScreen()
}
Route("user/:id?") { info in
UserScreen(id: info.parameters["id"])
}
一个视图,只有当它的路径与环境的路径匹配时才会渲染它的内容。使用 /* 来匹配更深层的路径。例如:路径 news/* 将匹配以下环境路径:/news、/news/latest、/news/article/1 等。
路径可以包含参数(也称为占位符),这些参数可以单独读取。参数的名称以冒号 (:) 为前缀。此外,可以通过在参数后面加上问号 (?) 来将其视为可选参数。这些参数作为 [String : String] 传递到 RouteInformation 对象中的 Route 的内容中。
注意:参数只能由字母数字字符(A-Z、a-z 和 0-9)组成,并且必须以字母开头。
func validateUserID(routeInfo: RouteInformation) -> UUID? {
UUID(routeInfo.parameters["id"] ?? "")
}
Route("user/:id", validator: validateUserID) { userID in
UserScreen(userID: userID)
}
Route 提供了一个额外的步骤来验证路径中的参数。
假设你的 Route 的路径是 /user/:id。默认情况下,:id 参数可以是任何东西。但在这种情况下,你只想使用有效的 UUID。使用 Route 的 validator 参数,你有机会验证(和转换)参数的值。
验证器是一个简单的函数,它接收一个 RouteInformation 对象(包含参数)并返回转换后的值作为可选值。新的转换后的值会传递给你的视图,而不是默认的 RouteInformation 对象。如果转换后的值为 nil,则 Route 将阻止渲染其内容。
NavLink(to: "/news/latest") {
Text("Latest news")
}
Button 的一个包装器,如果按下按钮,它将导航到给定的路径。
SwitchRoutes {
Route("latest") {
LatestNewsScreen()
}
Route("article/:id") { info in
NewsArticleScreen(articleID: info.parameters["id"]!)
}
Route(":unknown") {
ErrorScreen()
}
Route {
NewsScreen()
}
}
一个视图,它只渲染第一个路径与环境路径匹配的 Route。如果你希望使用回退,这将很有用。此视图可以稍微提高性能,因为它会阻止 Route 在先前的 Route 的路径已解决后进行路径匹配。
Navigate(to: "/error-404")
此视图将在渲染后自动导航到另一个路径。可以考虑在 SwitchRoutes 中的回退 Route 中使用此视图。
@EnvironmentObject var navigator: Navigator
一个包含 Router 数据的环境对象。使用此对象,你可以以编程方式导航到另一个路径、在历史堆栈中后退或前进。
@EnvironmentObject var routeInformation: RouteInformation
一个轻量级对象,包含当前 Route 的信息。 RouteInformation 包含相对路径和一个包含所有已解析参数的 [String : String]。
默认情况下,此对象在 Route 中传递到其内容。它也可以作为环境对象访问。