Sitelet https://github.com/flutter/packages/pull/12611
Skip to content

[go_router] Preserve nested pushes during config updates - #12611

Merged
auto-submit[bot] merged 2 commits into
flutter:mainfrom
itsUndefined:fix/go-router-preserve-nested-pushes
Sep 22, 2026
Merged

auto-submit[bot] merged 2 commits into
flutter:mainfrom
itsUndefined:fix/go-router-preserve-nested-pushes

Conversation

@itsUndefined

@itsUndefined itsUndefined commented Aug 25, 2026 •

Copy link
Copy Markdown
Contributor

RouteConfiguration.reparse currently restores only imperative matches at the root of the match list. Imperative matches created by pushing a route owned by a StatefulShellRoute branch are nested inside ShellRouteMatch.matches, so a dynamic RoutingConfig update silently drops them.

This change recursively enumerates imperative matches within shell matches and replays them against the new routing configuration. Rebuilding each match preserves the pushed navigation stack without retaining stale route objects from the previous configuration.

The regression test covers this sequence using the go_router test suite's standard A/B route naming:

  1. Start at /a.
  2. Push /b/details into another shell branch.
  3. Push /top above the shell.
  4. Update the routing configuration.
  5. Pop /top and verify that Screen B Detail is restored.

Fixes flutter/flutter#167344.

Pre-Review Checklist

This is a draft pending the author's review of the contribution, AI-assistance, Tree Hygiene, and CLA requirements above.

Local verification

  • flutter_plugin_tools format --packages go_router
  • flutter_plugin_tools analyze --packages go_router
  • flutter_plugin_tools test --packages go_router
  • flutter_plugin_tools validate --check-for-missing-changes --packages go_router

Footnotes

  1. Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. ↩ ↩2

@github-actions github-actions Bot added p: go_router triage-framework Should be looked at in framework triage labels Aug 25, 2026
@google-cla

google-cla Bot commented Aug 25, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@itsUndefined
itsUndefined marked this pull request as ready for review August 25, 2026 14:04

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request modifies RouteConfiguration.reparse to use a new recursive helper function, _imperativeMatches, which retrieves nested ImperativeRouteMatch instances from shell routes. This change ensures that pushed routes nested within a shell are preserved during reparsing when a dynamic routing configuration changes. A new widget test has been added to verify this behavior, and a pending changelog entry has been created. There are no review comments, and I have no feedback to provide.

@Piinks Piinks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thank you!

@Piinks
Piinks requested a review from elliette August 26, 2026 23:19

@elliette elliette left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with one suggestion!

Comment thread packages/go_router/lib/src/configuration.dart Outdated
@Piinks
Piinks requested a review from elliette August 27, 2026 19:00

@elliette elliette left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, looks good to me!

@elliette elliette added the CICD Run CI/CD label Aug 27, 2026
@elliette elliette added the autosubmit Merge PR when tree becomes green via auto submit App label Sep 22, 2026
@auto-submit
auto-submit Bot merged commit c4ee37c into flutter:main Sep 22, 2026
14 checks passed
pull Bot pushed a commit to edisplay/flutter that referenced this pull request Sep 24, 2026
…er#193289)

Roll Packages from c2b58e1a97fb to 431ea69a42e2 (56 revisions)

flutter/packages@c2b58e1...431ea69

2026-09-24 10687576+bparrishMines@users.noreply.github.com [cross_file]
Updates cross_file to a package separated federated plugin
(flutter/packages#11010)
2026-09-23 21270878+elliette@users.noreply.github.com [material_ui]
Remove static access of `copyWith` from `dart fix` golden tests for
`ThemeData/TextTheme` (flutter/packages#12994)
2026-09-23 happytoday83@naver.com [camera_avfoundation] Replace
deprecated high-resolution capture APIs (flutter/packages#12372)
2026-09-23 tarrinneal@gmail.com [pigeon] update nullish checks to use
new isNullish method (flutter/packages#12985)
2026-09-23 katelovett@google.com [ci] Assign batch release PR approver
as reviewer on sync-back PR (flutter/packages#12976)
2026-09-23 kf013099@gmail.com [image_picker] Fix scaling 10-bit images
(flutter/packages#12557)
2026-09-23 kevmoo@users.noreply.github.com [material_ui] Improve
Autocomplete, DrawerHeader, and Tooltip accessibility
(flutter/packages#12918)
2026-09-23 katelovett@google.com [google_fonts] Decouple GoogleFontsLite
for full tree-shaking and add full feature parity
(flutter/packages#12830)
2026-09-23 21270878+elliette@users.noreply.github.com [file_selector]
Ignore flakey `file_selector_android` tests (flutter/packages#12992)
2026-09-23 31859944+LongCatIsLooong@users.noreply.github.com [CI] Remove
bringup from `Mac_arm64 build_all_packages` targets
(flutter/packages#12978)
2026-09-22 1961493+harryterkelsen@users.noreply.github.com [material_ui]
Unskip 5 passing web tests in bottom_app_bar_test and text_field_test
(flutter/packages#12983)
2026-09-22 1961493+harryterkelsen@users.noreply.github.com
[cupertino_ui] Unskip 5 passing web tests in
adaptive_text_selection_toolbar_test and text_field_test
(flutter/packages#12984)
2026-09-22 me@davidmiguel.com [go_router] Fix ShellRoute chrome dropped
from semantics tree by ModalBarrier (flutter/packages#12353)
2026-09-22 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Add contrastLevel for M3 ColorScheme (flutter/packages#12743)
2026-09-22 themis.chatzie@gmail.com [go_router] Preserve nested pushes
during config updates (flutter/packages#12611)
2026-09-22 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Migrate M3 Chip template to use new gen_defaults
(flutter/packages#12847)
2026-09-22 50643541+Mairramer@users.noreply.github.com [material_ui] Fix
LocalHistoryEntry leak when double tapping Drawer scrim
(flutter/packages#12552)
2026-09-22 katelovett@google.com Update suggested reviewers
(flutter/packages#12974)
2026-09-22 fluttergithubbot@gmail.com Sync release-material_ui-1.4.0 to
main (flutter/packages#12966)
2026-09-22 fluttergithubbot@gmail.com Sync release-cupertino_ui-1.1.1 to
main (flutter/packages#12965)
2026-09-21 21270878+elliette@users.noreply.github.com [ci] Update repo
for 3.47 stable release (flutter/packages#12959)
2026-09-21 engine-flutter-autoroll@skia.org Manual roll Flutter from
27fec0e to 4fcd90b (1 revision) (flutter/packages#12904)
2026-09-21 katelovett@google.com Revert "[go_router_builder] Migrate to
material_ui" (flutter/packages#12962)
2026-09-21 31859944+LongCatIsLooong@users.noreply.github.com
[material_ui] Update `material_ui` tests to prevent them from failing
when framework `TextStyle` changes (flutter/packages#12728)
2026-09-21 katelovett@google.com [go_router_builder] Migrate to
material_ui (flutter/packages#12913)
2026-09-21 dkwingsmt@users.noreply.github.com [material_ui,
cupertino_ui] Bump Flutter version from to 3.47 (flutter/packages#12944)
2026-09-21 katelovett@google.com [cupertino_ui] Work around dart2wasm
optional parameter inference bug in example checkbox tests
(flutter/packages#12961)
2026-09-21 katelovett@google.com [cupertino_ui] Work around dart2wasm
optional parameter inference bug in checkbox_test.dart
(flutter/packages#12956)
2026-09-21 victor.orozco@cloudsufi.com [google_sign_in] PR 3/4 Migrate
ViewProvider and GID SDK wrappers from Objective-C to Swift
(flutter/packages#12657)
2026-09-21 victor.orozco@cloudsufi.com [google_sign_in] PR 2/4 Migrate
the plugin class from Objective-C to Swift. (flutter/packages#12655)
2026-09-20 10687576+bparrishMines@users.noreply.github.com
[cross_file_darwin] iOS/macOS implementation of `cross_file`
(flutter/packages#12910)
2026-09-20 10687576+bparrishMines@users.noreply.github.com
[cross_file_web] Web implementation of `cross_file`
(flutter/packages#12908)
2026-09-20 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Migrate M3 `InputChip` template to use new gen_defaults
(flutter/packages#12850)
2026-09-20 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Migrate M3 Checkbox defaults to new gen_defaults
(flutter/packages#12816)
2026-09-20 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Migrate M3 `FilterChip` template to use new gen_defaults
(flutter/packages#12849)
2026-09-19 zengyan@88.com [material_ui] Announce PopupMenuButton with a
child as a button (flutter/packages#12585)
2026-09-19 engine-flutter-autoroll@skia.org Roll Flutter (stable) from
9584c67 to 6a19cca (7 revisions) (flutter/packages#12950)
2026-09-18 21270878+elliette@users.noreply.github.com [material_ui]
Reduce the `material_ui` non-wasm web test suite
(flutter/packages#12763)
2026-09-18 31859944+LongCatIsLooong@users.noreply.github.com Replace
`Mac_x64` builders with `Mac_arm64` ones (flutter/packages#12941)
2026-09-18 32538273+ValentinVignal@users.noreply.github.com
[in_app_purchase_storekit] Use `_$SKPaymentDiscountWrapperToJson`
(flutter/packages#12721)
2026-09-18 gerardo.morales@cloudsufi.com [In_app _purchase] README
excerpt examples and changelog (flutter/packages#12739)
2026-09-18 brunocorona.alcantar@gmail.com [material_ui] Add alternative
input method for `RangeSlider` in `NavigationMode.directional`
(flutter/packages#12630)
2026-09-18 10687576+bparrishMines@users.noreply.github.com
[cross_file_android] Android implementation of `cross_file`
(flutter/packages#12909)
2026-09-18 50643541+Mairramer@users.noreply.github.com
[camera_platform_interface] Adds videoOutputPath support to
startVideoRecording (flutter/packages#12667)
2026-09-17 dkwingsmt@users.noreply.github.com [cupertino_ui] Migrate a
snippet in `CupertinoCheckbox`'s API doc to `{@example}` and add unit
tests (flutter/packages#12180)
2026-09-17 36861262+QuncCccccc@users.noreply.github.com [material_ui]
Default gen_defaults color helper prefix (flutter/packages#12848)
...
vashworth pushed a commit to vashworth/packages that referenced this pull request Sep 24, 2026
`RouteConfiguration.reparse` currently restores only imperative matches at the root of the match list. Imperative matches created by pushing a route owned by a `StatefulShellRoute` branch are nested inside `ShellRouteMatch.matches`, so a dynamic `RoutingConfig` update silently drops them.

This change recursively enumerates imperative matches within shell matches and replays them against the new routing configuration. Rebuilding each match preserves the pushed navigation stack without retaining stale route objects from the previous configuration.

The regression test covers this sequence using the go_router test suite's standard A/B route naming:

1. Start at `/a`.
2. Push `/b/details` into another shell branch.
3. Push `/top` above the shell.
4. Update the routing configuration.
5. Pop `/top` and verify that `Screen B Detail` is restored.

Fixes flutter/flutter#167344.

## Pre-Review Checklist

This is a draft pending the author's review of the contribution, AI-assistance, Tree Hygiene, and CLA requirements above.

### Local verification

- `flutter_plugin_tools format --packages go_router`
- `flutter_plugin_tools analyze --packages go_router`
- `flutter_plugin_tools test --packages go_router`
- `flutter_plugin_tools validate --check-for-missing-changes --packages go_router`

[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autosubmit Merge PR when tree becomes green via auto submit App CICD Run CI/CD p: go_router triage-framework Should be looked at in framework triage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[go_router] Updating the GoRouter.routeConfig loses the router state

3 participants