🕊
SwiftfulRouting Native, declarative routing for SwiftUI applications
Setup time: 1 minute
Sample project: https://github.com/SwiftfulThinking/SwiftfulRoutingExample
🤓
Overview SwiftUI is a declarative framework, and therefore, a SwiftUI router should be declarative by nature. Routers based on programatic code do not declare the view heirarchy in advance, but rather at the time of execution. The solution is to declare all modifiers to support the routing in advance by adding a new set of modifiers at the root of each segue's destination where the destination is an optional, type-erased view. This maintains a declarative view heirarchy while allowing the developer to still determine the destination at the time of execution.
☕️
Setup Add the package to your xcode project
https://github.com/SwiftfulThinking/SwiftfulRouting.git
Import the package
import SwiftfulRouting
Add a RouterView
at the top of your view heirarchy. A RouterView
will embed your view into a NavigationView and add modifiers to support all potential segues. If you're already inside a NavigationView, use SubRouterView
instead.
struct ContentView: View {
var body: some View {
RouterView {
MyView()
}
}
}
The Router
will be available as an EnvironmentObject
of all child views of RouterView
. Each Router
object can simultaneously support one active segue, one active alert, and one active modal. A new Router is created and added to the Environment after each segue.
struct MyView: View {
@EnvironmentObject private var router: Router
var body: some View {
VStack {
Text("Segue")
.onTapGesture {
router.showScreen(.push) {
ThirdView()
}
}
Text("Alert")
.onTapGesture {
router.showAlert(.alert, title: "Title") {
Button("OK") {
}
Button("Cancel") {
}
}
}
Text("Modal")
.onTapGesture {
router.showModal {
ChildView()
}
}
}
}
}
⏩
Segues Router supports native SwiftUI segues, including .push (NavigationLink), .sheet, and .fullScreenCover.
router.showScreen(.push, destination: () -> View)
router.showScreen(.sheet, destination: () -> View)
router.showScreen(.fullScreenCover, destination: () -> View)
router.dismissScreen()
🚨
Alerts Router supports native SwiftUI alerts, including .alert and .confirmationDialog.
router.showAlert(.alert, title: String, alert: () -> View)
router.showAlert(.confirmationDialog, title: String, alert: () -> View)
router.dismissAlert()
🪧
Modals Router also supports any modal transition, which displays above the current content.
router.showModal(destination: () -> View)
router.showModal(
transition: AnyTransition,
animation: Animation,
alignment: Alignment,
backgroundColor: Color?,
useDeviceBounds: Bool,
destination: () -> View)
router.dismissModal()