使用 Nillerr/Detour 的 SwiftUI 中丰富路由的概念验证

星云导航

此存储库包含使用 Nillerr/Detour 在 SwiftUI 中丰富路由的概念验证。

它由流、路由、演示文稿和流组成,作为 SwiftUI 视图的概念,并假定一次不超过一个模式表示的规则。

介绍

演示文稿显示从根视图显示为模式的流和视图。两者都受支持,并且在其中任何一个之间更改呈现的视图等待另一个的解雇以提供无缝支持。sheetfullScreenCover

import Detour

enum TodoPresentations {
  case edit
}

typealias TodoPresenter = Presenter<TodoPresentations>

struct ContentView: View {
  @StateObject var presenter = TodoPresenter()
  
  var body: some View {
    Presentations(presenter: presenter) {
      RootView(edit: { presenter.present(.edit) })
    } content: { presentation in
      switch presentation.presentable {
      case .edit:
        EditView(dismiss: { presenter.dismiss() })
      }
    }
  }
}

路线

路由通过 导航到视图。NavigationView

import Detour

enum TodoRoutes: Routeable {
  case todo(TodoDetailViewModel)

  var path: [TodoRoutes] {
    switch self {
    case .todo(let todo):
      return [.todo(todo)]
    }
  }
}

typealias TodoRouter = Router<TodoRoutes>

struct ContentView: View {
  @StateObject var router = TodoRouter()

  var body: some View {
    Routes(router: router) {
      TodoListView(selectTodo: { todo in router.navigate(to: .todo(todo)) })
    } content: { destination in
      switch destination {
      case .todo(let todo):
        TodoDetailView(viewModel: todo, dismiss: { router.navigate(to: nil) })
      }
    }
  }
}

Flows

Flows are navigation flows either using or itself.RoutesNavigationView

GitHub

点击跳转