-
Notifications
You must be signed in to change notification settings - Fork 25
Navigator
Facade type erasing the type of the underlying datasource
public struct Navigator
public init(path: @escaping () -> [IdentifiedScreen], go: @escaping (AnyScreen, ScreenID) -> Void, goToPath: @escaping ([AnyScreen], ScreenID) -> Void, goBack: @escaping (AnyScreen) -> Void, replace: @escaping ([AnyScreen]) -> Void, dismiss: @escaping (ScreenID) -> Void, dismissSuccessor: @escaping (ScreenID) -> Void, didAppear: @escaping (ScreenID) -> Void)
Initialises a Navigator wrapping a Datasource object
init(dataSource: Navigator.Datasource)
- dataSource: The wrapped data source
let stub
Append a screen after a given ScreenID
.
public func go<S: Screen>(to screen: S, on id: ScreenID)
go(to:, on:)
appends the given screen after the screen associated with the passed ScreenID
. If you call go(to:, on:)
for a ScreenID
that is not associated with the last screen in the current routing path, the routing path after the ScreenID
is replaced with [screen]
and therefore cut off.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1)]
navigator.go(to: C(), on: 1)
// New path
// [(A, 0), (B, 1)], (C, 2)]
- screen: Destination
- id:
ScreenID
used to identify where the destination should be appended
Replace the path after a given ScreenID
with the passed path.
public func go(to path: [AnyScreen], on id: ScreenID)
go(to:, on:)
appends the given path after the screen associated with the passed ScreenID
. If you call go(to:, on:)
for a ScreenID
that is not associated with the last screen in the current routing path, the routing path after the ScreenID
is replaced with path
and potentially cut off.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1)]
navigator.go(
to: [C().eraseToAnyScreen(), D().eraseToAnyScreen()],
on: 1
)
// New path
// [(A, 0), (B, 1)], (C, 2), (D, 3)]
- path: New path after
id
- id:
ScreenID
used to identify where the destination should be appended
Go back to the last occurence of the screen instance in the routing path.
public func goBack<S: Screen>(to screen: S)
The function appends the given screen after the screen associated with the passed ScreenID
. If you call go(to:, on:)
for a ScreenID
that is not associated with the last screen in the current routing path, the routing path after the ScreenID
is replaced with [screen]
and therefore cut off.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1), (C, 2)]
navigator.goBack(to: A())
// New path
// [(A, 0)]
- screen: Destination
Replace the current routing path with a new routing path.
public func replace(path: AnyScreen)
Example
// Curent path [(Content, ID)]
// [(A, 0), (B, 1)]
navigator.replace(
path: C().eraseToAnyScreen(), D().eraseToAnyScreen()
)
// New path
// [(C, 0), (D, 1)]
- path: The new routing path
Replace the current routing path with a new routing path.
public func replace(path: [AnyScreen])
replace(path:)
checks if a prefix of the new path was already part of the replaced routing path and makes sure to keep the IDs and hasAppeared state intact.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1)]
navigator.replace(
path: [
C().eraseToAnyScreen(),
D().eraseToAnyScreen()
]
)
// New path
// [(C, 0), (D, 1)]
- path: The new routing path
Removes the screen from the routing path.
public func dismiss(id: ScreenID)
dismiss(id:)
does not care take the screen's presentation style into account and cuts the routing path up to the passed id.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1), (C, 2), (D,3)]
navigator.dismiss(id: 2)
// New path
// [(A, 0), (B, 1)]
- id: The id identifying the screen that needs to be dismissed
Removes the screen successors from the routing path.
public func dismissSuccessor(of id: ScreenID)
dismissSuccessor(of id:)
does not care take the screen's presentation style into account and cuts the routing path after the passed id.
// Curent path [(Content, ID)]
// [(A, 0), (B, 1), (C, 2), (D,3)]
navigator.dismissSuccessor(of id: 2)
// New path
// [(A, 0), (B, 1), (C, 2)]
- id: The id identifying the screen that needs to be dismissed
static func mock(path: @escaping () -> [IdentifiedScreen] = { fatalError("path() unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, go: @escaping (AnyScreen, ScreenID) -> Void = { _, _ in fatalError("go(to:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, goToPath: @escaping ([AnyScreen], ScreenID) -> Void = { _, _ in fatalError("append(path:, to:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, goBack: @escaping (AnyScreen) -> Void = { _ in fatalError("goBack(to:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, replace: @escaping ([AnyScreen]) -> Void = { _ in fatalError("replace(path:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, dismiss: @escaping (ScreenID) -> Void = { _ in fatalError("dismiss(id:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, dismissSuccessor: @escaping (ScreenID) -> Void = { _ in fatalError("dismissSuccessor(of:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }, didAppear: @escaping (ScreenID) -> Void = { _ in fatalError("didAppear(id:) unimplemented in stub. Make sure to wrap your application in a Root view or inject Navigator via .environment(\\.navigator, navigator) for testing purposes.") }) -> Navigator
Enable logging received function calls and path changes.
func debug() -> Navigator
Generated at 2021-04-29T07:59:04+0000 using swift-doc 1.0.0-beta.6.
Types
- AnyPathBuilder
- AnyScreen
- Deeplink
- DeeplinkComponent
- DeeplinkComponent.Argument
- DeeplinkHandler
- DeeplinkParser
- EitherAB
- EitherABC
- EitherABCD
- EitherABCDE
- EitherABCDEF
- EitherABCDEFG
- EitherABCDEFGH
- EitherABCDEFGHI
- EitherABCDEFGHIJ
- IdentifiedScreen
- NavigationNode
- NavigationTreeBuilder
- Navigator
- Navigator.Datasource
- Navigator.DidAppearInvocation
- Navigator.DismissInvocation
- Navigator.GoBackToInvocation
- Navigator.GoToInvocation
- Navigator.GoToPathInvocation
- Navigator.NavigationIdentifier
- Navigator.ReplaceContentInvocation
- Navigator.ReplacePathInvocation
- Navigator.ReplaceScreenInvocation
- NavigatorKey
- OnDismissView
- PathBuilders
- PathBuilders.EmptyBuilder
- PathBuilders.WildcardView
- PathComponentUpdate
- PathUpdate
- Root
- ScreenPresentationStyle
- TreatSheetDismissAsAppearInPresenterKey
- _PathBuilder