Build1 distinct publisher3 min readPublished
Two unmaintained packages carry index jumping for Flutter lazy lists, and the archived one paid for it by keeping two lists in agreement. Nominating a centre sliver skips the measurement by moving offset zero onto the target row.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Viewport.center changes what zero means. Content placed before the centre sliver lays out at negative scroll offset, a behaviour the dev.to post notes is there for chat-style lists that grow upwards [16]. Split the list at the anchor: everything before it in one sliver laid out backwards from zero, the anchor and everything after it in a second sliver marked as the centre [17]. Scroll offset zero is then the anchor, not an estimate of it [17]. CustomScrollView exposes center as public API, and the framework's own chat-style examples rely on the same negative-offset layout [19].
The claim built on that is that jumping to index 842,013 costs what jumping to index 3 costs, because there is nothing above the anchor to measure or build [18]. For it to transfer, the backwards sliver has to be as lazy going up as an ordinary sliver is going down, and your jump has to be acceptable as a rebuild rather than an animation. The published snippet gives a controller, a builder over an itemCount of 1,000,000, and jumpToIndex, with no animated variant [20]. An animation needs a pixel distance between here and there, and the distance to an unbuilt row is exactly the number the list cannot produce [2].
The fixed-extent example shows why nobody wants to own the measured version even when the arithmetic is available. At 72 pixels a row the post puts index 842,013 at offset 60,624,936 [10]. That product is 842,013 x 72; 842,012 x 72 is 60,624,864, and the post's own framing counts 842,012 rows above the target [11][12]. One row of drift in a hand-checked example is the cheapest available argument against computing offsets by hand.
The approaches people reach for first fail for one reason each. Estimate-then-correct visibly hunts, and because the correction lands after paint the user reads the wrong rows first [13]. ensureVisible needs an element, and index 842,013 has none [14]. Building everything is a million elements and render objects with a frame budget measured in seconds, which is what shrinkWrap: true quietly does in some nestings [15]. SliverFixedExtentList is genuinely the fastest option and stops working at the first row that wraps to two lines [10].
On the two dead packages the evidence is uneven. The post is specific about scrollable_positioned_list: it built a second complete list anchored at the target index and cross-faded to it, so for the duration of the transition two full sets of children were alive, laid out and painting, showing up on heavy rows as a flash, a frame drop, sometimes a scrollbar that jumps twice [7][8]. It ties the maintenance burden to that same design, two lists that must agree about scroll position, item extents and which one is authoritative, kept correct across Flutter versions [9]. For scroll_to_index it offers a publish date and nothing else [5]. The million-plus monthly downloads are an aggregate across both, so this source cannot say which package carries the traffic [6].
The anchored version runs one viewport, one set of children, no cross-fade [21]. That removes the state the post says was hard to keep correct [9]. It does not remove the reason two packages existed: Flutter still ships no index jump [3], and jumpTo still wants pixels [1].
Ranked by verification strength, evidence, and original report placement.
ScrollController.jumpTo takes a pixel offset, not an index.
Converting an index to a pixel offset requires the total height of all rows above the target, and a lazy list has never built them, so it does not know how tall they are.
Flutter ships no built-in answer for scrolling to an index in a lazy list.
The package scrollable_positioned_list has been archived by Google.
The package scroll_to_index was last published in 2022, and the post gives no other detail about why it stopped.
scrollable_positioned_list built a second complete list, anchored at the target index, and cross-faded from the old one to the new one.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · September 5, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
A GPU delegate that returns nothing: why exception-based fallbacks miss the real failure1 distinct publisher
invest
Brinkema outlaws three Google auction mechanics without touching its 91% ad server share1 distinct publisher
invest
OpenAI rates GPT-6 Astra capable of hacking hardened systems without human guidance1 distinct publisher
build
A key in the app binary is a bucket handover; presigned uploads also drop the proxy data bill1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Checkable primitive, performance claim left untested
The mechanism sits on something a reader can confirm in Flutter itself: center is public on CustomScrollView, and the framework's reverse-scrolling examples already lay content out at negative offsets. The performance claim has nothing attached to it, no timings and no profile, and the one worked calculation in the piece disagrees with its own row count by exactly one row.
Capability in demand, this answer still unproven
The usage evidence belongs to the packages being replaced: over a million downloads a month across two of them, aggregated and sourced to the post. anchored_list appears only as an API snippet, with no version, publication date or app using it named anywhere in this reporting.
Constant-cost framing outruns the measurement
Saying a jump to index 842,013 costs what a jump to index 3 costs is a strong claim to publish with no numbers, and the piece says nothing about what rebuilding both slivers costs on each jump. The snippet also omits an animated variant, which is the version most product lists need. The reasoning is sound enough that the overstatement is narrow rather than hollow.
Reads as the package's own introduction
The write-up is documentation for anchored_list: it names the package, publishes its controller and builder, declares the two existing options dead, and ends on why the name is about anchoring rather than jumping. Whether the writer maintains that package is never stated, which is the problem, because a reader cannot weigh the recommendation without knowing. dev.to is self-published, so no editor stood between the claim and the page.
Single author, single platform, uncorroborated
Everything in our coverage traces to a single self-published post, and its one visible calculation slips by a row. The structural argument still deserves more weight than the figures around it, because it stands on Flutter behaviour any reader can inspect.