`accord_home_channels.dart` called `ReorderableListView.builder` with
`onReorderItem:`, which isn't a parameter on Flutter's built-in widget — it
requires `onReorder:`. This was a hard `flutter analyze` error on stable
(missing_required_argument + undefined_named_parameter), breaking any build
touching the file. Fixes #138.
The two APIs differ in `newIndex` semantics: `onReorderItem` reported the
target index in post-removal coordinates, while `onReorder` reports it
pre-removal (the dragged slot is still counted). Renamed the argument and
added the canonical `if (newIndex > oldIndex) newIndex -= 1;` so the existing
reorder logic — which indexes into the post-removal list — stays correct and
drag-down moves don't land one slot too low.
Why it reached master: the error landed in #107 and CI was green, because the
analyze gate only ran the pinned `beta` channel, which tolerated
`onReorderItem`. Matrix the analyze/test job over `[beta, stable]` so a
widget/SDK API that diverges between channels fails the gate instead of
shipping. Cache keys now include the channel so the legs don't collide.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fixes #138.
Problem
lib/features/spaces/views/accord_home_channels.dartcalledReorderableListView.builderwithonReorderItem:, which is not a parameter on Flutter's built-inReorderableListView— it requiresonReorder:. On stable this is two hardflutter analyzeerrors (missing_required_argument+undefined_named_parameter), soflutter analyzeis non-clean onmasterand any build touching the file fails.Fix
onReorderItem:→onReorder:.newIndexsemantics:onReorderItemreported the target index in post-removal coordinates, while Flutter'sonReorderreports it pre-removal (the dragged slot is still counted). Added the canonicalif (newIndex > oldIndex) newIndex -= 1;at the top of_onReorderso the existing logic — which indexes into the post-removal list — stays correct and drag-down moves don't land one slot too low.Verified clean with stable 3.38.1 (the toolchain in the issue):
Why it reached master, and the CI guard
The error landed in #107 and CI was green — because the analyze gate only ran the pinned
betachannel, which toleratedonReorderItem. A channel-skew break sailed through.This PR matrixes the
analyzejob over[beta, stable](fail-fast: false), so a widget/SDK API that's valid on one channel but a hard error on the other now fails the merge gate. Cache keys include the channel so the legs don't clobber each other.Note: this makes
stablea hard blocker, including for releases (release.ymlreuses this gate viaworkflow_call). The tree is currently clean on stable. If you'd preferstablebe advisory (report-only) until the port settles, that's a one-linecontinue-on-errorchange — shout.🤖 Generated with Claude Code