用于从 SwiftUI 视图中抽象导航逻辑的路由库
说明
Routing
是一个库,用于从 SwiftUI 视图中分离导航逻辑。
- 将导航逻辑与 SwiftUI 视图取消耦合。
- 实现对问题的更好分离
开始使用
- 创建一个符合
Routable
的Enum
,以表示希望路由到的不同视图。
import SwiftUI
import Routing
enum ExampleRoute: Routable {
case viewA
case viewB(String)
case viewC
@ViewBuilder
func viewToDisplay(router: Router<ExampleRoute>) -> some View {
switch self {
case .viewA:
ViewA(router: router)
case .viewB(let description):
ViewB(router: router, description: description)
case .viewC:
ViewC(router: router)
}
}
var navigationType: NavigationType {
switch self {
case .viewA:
return .push
case .viewB(_):
return .sheet
case .viewC:
return .fullScreenCover
}
}
}
- 将视图层次结构包装在
RoutingView
中,后者使用Routable
枚举进行初始化。它会向根视图注入一个Router
实例。
import SwiftUI
import Routing
struct ContentView: View {
var body: some View {
RoutingView(ExampleRoute.self) { router in
RootView(router: router)
}
}
}
struct RootView: View {
@StateObject var router: Router<ExampleRoute>
init(router: Router<ExampleRoute>) {
_router = StateObject(wrappedValue: router)
}
var body: some View {
VStack() {
Button("View A") {
router.routeTo(.viewA)
}
Button("View B") {
router.routeTo(.viewB("Got here from RootView"))
}
Button(NavigationSwiftUI