Add popAndPush convenience method (fixes #110)#112
Open
pgovindaraj1 wants to merge 1 commit into
Open
Conversation
Adds a method to (where Element: RouteProtocol), , and that atomically pops the top pushed screen and pushes a new screen in a single routes mutation.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Picked up issue #110 — the ask was for a way to pop the current screen and push a new one with a proper push animation.
The problem with the current workaround of calling pop() and push() separately is that they fire as two distinct state updates, so SwiftUI only animates the pop and the push transition never happens. Not a great experience when you're trying to replace screen B with screen C and want it to feel like a forward navigation.
The fix is a popAndPush(_ screen:) method that performs both operations on the routes array in a single mutation. Since the net change is committed atomically, calculateSteps(from:to:) sees it as "pop, then push" and sequences the two animations correctly — you get the full push transition as expected.
Added the method to Array (the core implementation), FlowPath, and FlowNavigator to match the pattern of every other convenience method in the library. Also included unit tests covering replacing the top screen in a multi-screen stack and in a single-screen stack.