SwiftUI Router

使用基于路径的路由,轻松维护 SwiftUI 应用的导航。

SwiftUI SwiftUI Swift Xcode MIT

通过 SwiftUI Router,你可以使用基于路径的路由来驱动你的 SwiftUI 应用。通过利用基于路径的系统,你的应用中的导航将变得更灵活且更易于维护。


⚠️在 WWDC22 上,苹果向 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

Router {
	RootView()
}

路由环境的入口。将你的整个应用(或仅需要路由的部分)包装在 Router 中。此视图将初始化路由所需的所有必要环境值。


Route

Route("news/*") {
	NewsScreen()
}
Route("settings") {
	SettingsScreen()
}
Route("user/:id?") { info in
	UserScreen(id: info.parameters["id"])
}

一个视图,只有当它的路径与环境的路径匹配时才会渲染它的内容。使用 /* 来匹配更深层的路径。例如:路径 news/* 将匹配以下环境路径:/news/news/latest/news/article/1 等。

Parameters

路径可以包含参数(也称为占位符),这些参数可以单独读取。参数的名称以冒号 (:) 为前缀。此外,可以通过在参数后面加上问号 (?) 来将其视为可选参数。这些参数作为 [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。使用 Routevalidator 参数,你有机会验证(和转换)参数的值。

验证器是一个简单的函数,它接收一个 RouteInformation 对象(包含参数)并返回转换后的值作为可选值。新的转换后的值会传递给你的视图,而不是默认的 RouteInformation 对象。如果转换后的值为 nil,则 Route 将阻止渲染其内容。


NavLink

NavLink(to: "/news/latest") {
	Text("Latest news")
}

Button 的一个包装器,如果按下按钮,它将导航到给定的路径。


SwitchRoutes

SwitchRoutes {
	Route("latest") {
		LatestNewsScreen()
	}
	Route("article/:id") { info in
		NewsArticleScreen(articleID: info.parameters["id"]!)
	}
	Route(":unknown") {
		ErrorScreen()
	}
	Route {
		NewsScreen()
	}
}

一个视图,它只渲染第一个路径与环境路径匹配的 Route。如果你希望使用回退,这将很有用。此视图可以稍微提高性能,因为它会阻止 Route 在先前的 Route 的路径已解决后进行路径匹配。


Navigate

Navigate(to: "/error-404")

此视图将在渲染后自动导航到另一个路径。可以考虑在 SwitchRoutes 中的回退 Route 中使用此视图。


Navigator

@EnvironmentObject var navigator: Navigator

一个包含 Router 数据的环境对象。使用此对象,你可以以编程方式导航到另一个路径、在历史堆栈中后退或前进。


RouteInformation

@EnvironmentObject var routeInformation: RouteInformation

一个轻量级对象,包含当前 Route 的信息。 RouteInformation 包含相对路径和一个包含所有已解析参数[String : String]

默认情况下,此对象在 Route 中传递到其内容。它也可以作为环境对象访问。


许可证 📄

MIT 许可证.