Skip to content

fix(mobile): avoid bottom-edge scroll bounce - #5911

Open
cachacon-ai wants to merge 1 commit into
block:mainfrom
cachacon-ai:fix/mobile-ios-bottom-bounce
Open

cachacon-ai wants to merge 1 commit into
block:mainfrom
cachacon-ai:fix/mobile-ios-bottom-bounce

Conversation

@cachacon-ai

Copy link
Copy Markdown

Summary

  • keep passive channel live updates pinned without restarting bottom-edge animations
  • skip thread-tail scrolls when the newly laid-out tail is already visible
  • only follow live agent activity when the reader was at its tail, using a coalesced instant correction

Validation

  • cd mobile && flutter test test/features/channels/channel_detail_page_test.dart
  • cd mobile && flutter analyze lib/features/channels/channel_detail_page.dart lib/features/channels/thread_detail_page.dart lib/features/channels/agent_activity/agent_activity_sheet.dart test/features/channels/channel_detail_page_test.dart

Fixes repeated iOS rubber-banding during rapid agent updates while preserving user-detached scroll positions.

@cachacon-ai
cachacon-ai requested a review from a team as a code owner August 14, 2026 21:35

@themiguelamador themiguelamador left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The PR fails two required mobile gates. The pinned Dart formatter rewrites agent_activity_sheet.dart, message_list.dart, and the new widget test, so dart format --output=none --set-exit-if-changed . exits nonzero. After formatting, the file-size ratchet also rejects thread_detail_page.dart at 1,004 lines against the 1,000-line cap. These failures block just mobile-check/CI even though the behavior tests pass.

I fixed both in commit f6e17b624 (branch review/pr-5911-fix): applied the repository formatter and removed the redundant four-line explanation around the self-explanatory threadTailIsVisible() guard, bringing the file to 999 lines without changing behavior.

Verified with the focused channel detail suite (122 tests), just mobile-check, all 1,400 mobile tests, and git diff --check. Per repository policy, I did not run Flutter build/run/clean/upgrade commands.

brow added a commit that referenced this pull request Nov 12, 2026
## Summary

Improve scrolling performance in the Messages channel list by building
Solo and Team rows only as needed. Sections currently mount all their
rows as one scroll item, which causes long UI stalls with large channel
lists.

In manual iPhone runs with 500 channels, maximum observed Flutter UI
work fell from **65.5 ms to 4.2 ms** after adding lazy rows to a build
with header isolation (#9400). The tester reported much smoother
scrolling. This was an exploratory comparison with different gestures,
not a controlled benchmark of this independent branch.

Use stable channel keys and retain section controls, sorting, and
collapse animations. Clip the sliver extent during collapse so the
animation does not mount the entire section. The shared transition
supports downward vertical lists.

This is an independent production-only change. Test fixtures and
diagnostic instrumentation are excluded; regression checks were run
locally and are not included in this PR.

### Related issue

Related: #5911 addresses scrolling behavior inside conversations. This
change addresses eager row mounting in the Messages channel inventory.
No matching open PR or issue was identified in the focused duplicate
search.

### Testing

On a physical iPhone with 500 channels against an isolated local relay,
maximum Flutter UI work fell from 65.5 ms to 4.2 ms after adding lazy
rows to a build that already isolated header rebuilds. The tester
reported much smoother scrolling. Gestures differed between runs, so
this is not a controlled benchmark or an isolated measurement of this
branch on its own. The device run preceded the refresh onto current
main.

Local-only regression journeys passed 12 tests on this independent
branch. They cover page laziness and updates, variable-height rows,
large text, the last row, collapse reversal, reduced motion, and
semantics. These checks are excluded from the commit.

Smaller visible jumps remain under investigation; this PR does not claim
to resolve them.

Generated with Codex

---------

Signed-off-by: Michael Fransen <[email protected]>
Signed-off-by: Tom Brow <[email protected]>
Co-authored-by: Karl <9e8471f7b792e46c9c100840959dc71c660786c79c2a3165dbcaf58f52c4266e@buzz.block.builderlab.xyz>
Co-authored-by: Tom Brow <[email protected]>
Co-authored-by: Tom Brow <[email protected]>
Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz>
michaelfransen added a commit that referenced this pull request Nov 12, 2026
## Summary

Improve scrolling performance in the Messages channel list by avoiding
unnecessary inventory rebuilds as the header moves. Keep scroll-driven
header state in a notifier and retain the inventory while the header
animates. Provider and parent updates still rebuild the inventory with
current channel data.

This complements the lazy-row optimization in #9401. In manual iPhone
runs with 500 channels, adding lazy rows on top of header isolation
reduced maximum observed Flutter UI work from **65.5 ms to 4.2 ms**.
That measurement reflects the added lazy-row change; no standalone
performance gain was established for header isolation.

This is an independent production-only change. Test fixtures and
diagnostic instrumentation are excluded; regression checks were run
locally and are not included in this PR.

### Related issue

Related: #5911 addresses scrolling behavior inside conversations. This
change addresses header-triggered rebuilds in the Messages channel
inventory. No matching open PR or issue was identified in the focused
duplicate search.

### Testing

Exercised Messages on a physical iPhone with 500 channels against an
isolated local relay. Header collapse and channel updates worked. This
change alone did not remove the large scroll stalls; lazy section rows
are a separate change. The device run preceded the refresh onto current
main.

Local-only regression checks passed 10 tests on this independent branch.
They verify stable inventory identity during header movement and visible
channel updates. These checks are excluded from the commit.

Remaining visible jumps are under investigation; this PR does not claim
to resolve them.

Generated with Codex

Signed-off-by: Michael Fransen <[email protected]>
Co-authored-by: Karl <9e8471f7b792e46c9c100840959dc71c660786c79c2a3165dbcaf58f52c4266e@buzz.block.builderlab.xyz>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants