[go_router] Fix pop() restoring stale configuration when route has onExit#11241
Conversation
…has onExit When a route has onExit, _handlePopPageWithRouteMatch defers the pop to a microtask. Calling restore() immediately with the pre-pop currentConfiguration can trigger async redirects that overwrite the eventual pop result. Detect synchronous completion by comparing currentConfiguration identity before and after the pop call, avoiding any mutable flag on the delegate.
|
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. |
There was a problem hiding this comment.
Code Review
This pull request fixes an issue where GoRouter.pop() could restore a stale configuration when a route has an onExit handler, which could lead to the popped route reappearing. The fix cleverly uses an identical() check to ensure restore() is only called for synchronous pops where the configuration has actually changed. The changes are well-supported by new regression tests that cover the fixed scenario and related edge cases. My review includes one suggestion to enhance a code comment for better long-term maintainability.
| // Only restore when the pop completed synchronously (no onExit). | ||
| // If deferred, currentConfiguration is still the same instance. |
There was a problem hiding this comment.
The current comment explains the condition well. To further improve maintainability, consider adding a brief note about why this check is important, mentioning the risk of restoring a stale configuration. This will help future developers understand the full context and prevent accidental regressions.
// Only restore on a synchronous pop to avoid restoring a stale configuration.
// A deferred pop (e.g. due to an async `onExit`) would leave the
// `currentConfiguration` instance unchanged, and restoring it could cause issues.
chunhtai
left a comment
There was a problem hiding this comment.
code lgtm, the go_router now needs to put change log in pending_changelogs folder, ci should flag this.
…n changes Replace direct CHANGELOG.md and pubspec.yaml modifications with the pending_changelogs workflow required for batch release packages.
|
@chunhtai Thanks for the review! Moved changelog to pending_changelogs/. |
…er#185287) flutter/packages@c2e3d1f...01c505f 2026-04-20 engine-flutter-autoroll@skia.org Roll Flutter from 8e8a194 to 2844af6 (13 revisions) (flutter/packages#11531) 2026-04-17 stuartmorgan@google.com [google_maps_fluter] Switch to Kotlin Pigeon (flutter/packages#11522) 2026-04-17 engine-flutter-autoroll@skia.org Roll Flutter (stable) from db50e20 to cc0734a (8 revisions) (flutter/packages#11525) 2026-04-17 engine-flutter-autoroll@skia.org Roll Flutter from 31f1802 to 8e8a194 (22 revisions) (flutter/packages#11523) 2026-04-17 stuartmorgan@google.com [google_maps_flutter] Fix various Java warnings (flutter/packages#11516) 2026-04-16 srawlins@google.com [google_maps_flutter] Use super parameters in more places in examples (flutter/packages#11517) 2026-04-16 engine-flutter-autoroll@skia.org Roll Flutter from c1b14e9 to 31f1802 (46 revisions) (flutter/packages#11518) 2026-04-15 stuartmorgan@google.com [tool] Update java formatter (flutter/packages#11508) 2026-04-15 stuartmorgan@google.com [quick_actions] Remove manual thread hop in Android response (flutter/packages#11445) 2026-04-15 49699333+dependabot[bot]@users.noreply.github.com Bump lewagon/wait-on-check-action from 1.6.0 to 1.7.0 in the all-github-actions group (flutter/packages#11510) 2026-04-14 magder@google.com Skip dependabot updates for minor versions of gradle and kotlin (flutter/packages#11509) 2026-04-14 chick.developer@gmail.com [go_router] Fix pop() restoring stale configuration when route has onExit (flutter/packages#11241) 2026-04-14 stuartmorgan@google.com [url_launcher] Switch to Kotlin Pigeon (flutter/packages#11473) 2026-04-14 okorohelijah@google.com [pr-fix] Run all flutter/packages macOS tests using Xcode 26 and iOS 26 simulator (flutter/packages#10635) 2026-04-14 bolling.ludwig@gmail.com [camera_platform_interface] Add setJpegImageQuality method (flutter/packages#11454) 2026-04-14 engine-flutter-autoroll@skia.org Roll Flutter from 2fa45e0 to c1b14e9 (19 revisions) (flutter/packages#11506) 2026-04-14 stuartmorgan@google.com [local_auth] Switch to Kotlin Pigeon (flutter/packages#11482) 2026-04-13 fluttergithub-bot@google.com Sync release-go_router to main (flutter/packages#11499) 2026-04-13 slater.jay@gmail.com [mustache_template] Fix auto-generated specification tests, run with `dart test` (flutter/packages#11056) 2026-04-13 engine-flutter-autoroll@skia.org Roll Flutter from bf18e39 to 2fa45e0 (19 revisions) (flutter/packages#11497) 2026-04-10 engine-flutter-autoroll@skia.org Roll Flutter from 81c87ea to bf18e39 (18 revisions) (flutter/packages#11488) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
GoRouter.pop()unconditionally calledrestore()afterrouterDelegate.pop(). When the route hasonExit, the pop is deferred to a microtask, sorestore()was called with the pre-pop configuration. This caused async redirects to overwritethe post-pop state, making the popped route reappear.
Fixed by comparing
currentConfigurationidentity before and after pop.restore()is only called when the configuration was actually updated (synchronous pop).Fixes flutter/flutter#174525 flutter/flutter#180002
Pre-Review Checklist
[shared_preferences]///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the
gemini-code-assistbot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.Footnotes
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