Meta tags:
description= A feed screen felt heavy while scrolling, only on mid-range phones. Layout Inspector told the whole... Tagged with android, jetpackcompose, recomposition, stability.;
keywords= android, jetpackcompose, recomposition, stability, software, coding, development, engineering, inclusive, community;
Headings (most frequently used words):
the, ghosts, in, recomposition, part, series, it, your, lazycolumn, recomposes, on, every, scroll, dev, community, compose, can, skip, if, you, let, fix, is, type, see, for, yourself, takeaway, top, comments, more, from, siddharth, pandalai,
Text of the page (most frequently used words):
the (30), and (16), dev (13), every (11), #compose (10), list (10), you (9), that (8), your (8), recomposition (7), share (6), post (6), #scroll (6), lazycolumn (5), recomposes (5), not (5), composable (5), rows (5), items (5), community (4), one (4), data (4), android (4), ghosts (4), series (4), skipping (4), row (4), fullscreen (4), mode (4), feed (4), skip (4), changed (4), create (3), with (3), software (3), use (3), when (3), more (3), siddharth (3), pandalai (3), for (3), abuse (3), comments (3), story (3), unstable (3), immutable (3), key (3), cannot (3), account (2), log (2), 2026 (2), code (2), conduct (2), about (2), tracks (2), sensors (2), them (2), from (2), follow (2), this (2), hide (2), are (2), comment (2), will (2), still (2), visible (2), via (2), report (2), let (2), top (2), collectasstate (2), quietly (2), leaking (2), work (2), part (2), linkedin (2), recomposer (2), only (2), give (2), reason (2), fast (2), type (2), could (2), layout (2), inspector (2), add (2), keys (2), whole (2), see (2), stable (2), its (2), exit (2), enter (2), while (2), there (2), change (2), skips (2), whose (2), fun (2), impossible (2), have (2), scrolling (2), can (2), stability (2), has (2), make (2), was (2), had (2), copy (2), link (2), search (2), place, where, coders, stay, date, grow, their, careers, made, love, 2016, ruby, rails, built, powers, other, inclusive, communities, open, source, forem, terms, privacy, policy, mlh, shop, free, postgres, database, contact, showcase, organization, accounts, advertise, help, education, videos, challenges, home, space, discuss, keep, development, manage, career, global, threshold, how, delete, valid, heuristics, thresholds, location, two, disagree, rank, imu, sensorfusion, filter, needs, documented, exception, codequality, edgecases, filtering, jul, joined, further, actions, may, consider, blocking, person, reporting, confirm, child, well, sure, want, become, hidden, but, permalink, dismiss, preview, submit, templates, quickly, answer, faqs, store, snippets, template, trusted, user, personal, subscribe, loop, github, featuring, full, field, notes, engineer, who, writes, iteration, loopdown, redraws, room, stop, giving, reasons, slow, default, almost, janky, really, same, someone, handed, stopped, started, repainting, house, takeaway, turn, counts, counter, climbs, switch, counters, stillness, point, yourself, without, position, insert, below, shifts, identity, redraw, than, needed, ties, postrow, build, now, knows, collection, unchanged, toimmutablelist, persistentlistof, kotlinx, collections, immutablelist, after, works, before, fix, plain, ones, interface, thing, behind, mutable, under, feet, compiler, rule, out, treats, parameter, assumes, might, read, means, redrawing, everything, constantly, depends, prove, parameters, did, some, types, proof, easy, others, quiet, superpower, called, inputs, running, entirely, most, why, ghost, cause, screen, felt, heavy, mid, range, phones, told, recomposing, frame, including, all, jetpackcompose, posted, aug, mastodon, facebook, copied, clipboard, pick, gem, boost, save, jump, fire, raised, hands, exploding, head, unicorn, like, reaction, close, powered, algolia, navigation, menu, content,
Text of the page (random words):
your lazycolumn recomposes on every scroll dev community skip to content navigation menu search powered by algolia search log in create account dev community close add reaction like unicorn exploding head raised hands fire jump to comments save boost pick as gem more copy link copy link copied to clipboard share to x share to linkedin share to facebook share to mastodon share post via report abuse siddharth pandalai posted on aug 30 your lazycolumn recomposes on every scroll android jetpackcompose recomposition stability ghosts in the recomposition 2 part series 1 your lazycolumn recomposes on every scroll 2 collectasstate is quietly leaking your work a feed screen felt heavy while scrolling only on mid range phones layout inspector told the whole story every visible row was recomposing on every scroll frame including rows whose data had not changed at all there was a ghost in the recomposition and it had one cause compose can skip if you let it compose has a quiet superpower called skipping when a composable s inputs have not changed compose skips re running it entirely that is most of why it is fast skipping depends on stability to skip a composable compose has to prove its parameters did not change some types make that proof easy others make it impossible a plain list is one of the impossible ones list is an interface the thing behind it could be a mutable list that changed under compose s feet and the compiler cannot rule that out so compose treats every list parameter as unstable assumes it might have changed and recomposes the rows that read it on a scrolling feed that means redrawing everything you can see constantly the fix is the type before list is unstable rows cannot skip composable fun feed items list post after an immutable list is stable skipping works composable fun feed items immutablelist post enter fullscreen mode exit fullscreen mode use kotlinx collections immutable and build the list with persistentlistof or toimmutablelist now compose knows the collection cannot change and it skips rows whose data is unchanged while you are there give the items a key lazycolumn items items key it id post postrow post enter fullscreen mode exit fullscreen mode without keys compose tracks rows by position insert one at the top and every row below shifts identity so more of them redraw than needed a stable key ties a row to its data see it for yourself turn on recomposition counts in layout inspector and scroll with an unstable list the counter on every row climbs switch to an immutable list and add keys and the counters go still that stillness is the whole point the takeaway compose is not slow it is fast by default almost every compose is janky story is really the same story someone handed a composable a type it could not reason about so it stopped skipping and started repainting the house the recomposer only redraws the room when you give it a reason stop giving it reasons iteration 4 of the loopdown field notes from an engineer who writes series ghosts in the recomposition featuring the recomposer the full series ghosts in the recomposition follow the loop linkedin dev to github ghosts in the recomposition 2 part series 1 your lazycolumn recomposes on every scroll 2 collectasstate is quietly leaking your work top comments 0 subscribe personal trusted user create template templates let you quickly answer faqs or store snippets for re use submit preview dismiss code of conduct report abuse are you sure you want to hide this comment it will become hidden in your post but will still be visible via the comment s permalink hide child comments as well confirm for further actions you may consider blocking this person and or reporting abuse siddharth pandalai follow joined jul 19 2026 more from siddharth pandalai every filter needs a documented exception android filtering edgecases codequality when two sensors disagree rank them android sensors sensorfusion imu one global threshold is how you delete valid data android location thresholds heuristics dev community a space to discuss and keep up software development and manage your software career home dev challenges dev videos dev education tracks dev help advertise on dev organization accounts dev showcase about contact free postgres database dev shop mlh code of conduct privacy policy terms of use built on forem the open source software that powers dev and other inclusive communities made with love and ruby on rails dev community 2016 2026 we re a place where coders share stay up to date and grow their careers log in create account
|