Repository navigation
Make ScrollPhysics reactive by introducing shouldUpdate - #189664
Conversation
This commit allows ScrollPhysics subclasses to update their parameters without requiring a change in runtimeType. By overriding shouldUpdate, physics classes can return true to signal that their internal parameters have changed and the ScrollPosition should adopt the new physics, resolving long-standing bugs with physics updates.
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a shouldUpdate method to ScrollPhysics, allowing subclasses to trigger a ScrollPosition update when rebuilt with a new physics instance of the same type. ScrollableState is updated to evaluate this method, and a test suite is added to verify the behavior. The review feedback suggests overriding shouldUpdate in built-in subclasses with configuration parameters, such as BouncingScrollPhysics, to ensure they react correctly to parameter changes.
There was a problem hiding this comment.
Code Review
This pull request introduces a shouldUpdate method to ScrollPhysics to allow subclasses to trigger a ScrollPosition update when configuration parameters change, updates ScrollableState to evaluate this method, and adds corresponding tests. Feedback suggests refactoring the conditional check in ScrollableState into two separate if statements to avoid using the bang operator (!) and leverage Dart's flow analysis for non-nullable type promotion.
…for BouncingScrollPhysics behavior
Piinks
left a comment
There was a problem hiding this comment.
Thank @Mairramer!
Making ScrollPhysics reactive via shouldUpdate is sound and follows existing Flutter framework patterns (CustomPainter.shouldRepaint, ScrollBehavior.shouldNotify), however there is a runtime TypeError bug in ScrollPhysics.shouldUpdate:
When a wrapper physics has its parent changed to a subclass with a covariant-narrowed parameter (such as BouncingScrollPhysics.shouldUpdate(covariant BouncingScrollPhysics old)), invoking parent!.shouldUpdate(old.parent!) throws a runtime _TypeError if old.parent has a different runtime type (e.g. ClampingScrollPhysics).
I've left inline comments on the specific lines with detailed rationale and suggested fixes.
Co-authored-by: Kate Lovett <[email protected]>
Co-authored-by: Kate Lovett <[email protected]>
…date tests for ScrollPhysics behavior
victorsanni
left a comment
There was a problem hiding this comment.
LGTM with some nits.
|
Curious to see what the Google testing impact might be. I suspect we have implementors of this class |
|
autosubmit label was removed for flutter/flutter/189664, because - The status or check suite Dashboard Checks has failed. Please fix the issues identified (or deflake) before re-applying this label. |
|
Looks like there are some bad doc references here that need to be addressed: |
Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
…r#12660) Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
…r#12660) Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
Closes #80051
issue_example.mov
Pre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.
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.