用于从 SwiftUI 视图中抽象导航逻辑的路由库

说明

Routing 是一个库,用于从 SwiftUI 视图中分离导航逻辑。

  • 将导航逻辑与 SwiftUI 视图取消耦合。
  • 实现对问题的更好分离

开始使用

  1. 创建一个符合 RoutableEnum,以表示希望路由到的不同视图。

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
        }
    }
}
  1. 将视图层次结构包装在 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