masonry_kit 0.3.0
masonry_kit: ^0.3.0 copied to clipboard
A masonry grid whose layout is computed once and never revised, so several grids can share one CustomScrollView without the view jumping backwards.
0.3.0 #
An audit of every package in this repo found six defects here, two of which made tiles disappear or re-measured the whole list. Worth taking.
Fixed #
- A tile that changed its own size after being measured was never painted
again. Children are laid out loose on the main axis with
parentUsesSize, so none of them is a relayout boundary: when a tile dirtied itself — aImage.networkresolving, a font arriving, its ownsetState— it marked this sliver dirty but the relayout walk then skipped it, so it stayed_needsLayoutand the framework refused to paint it. The tile simply vanished. Every carried-over child is relaid out now;RenderObject.layouthas a fast path for a clean child, so the steady state is unchanged, and the never-revise contract holds because the slot still comes fromslotOf(index). - Any ancestor rebuild threw away every placement and re-measured from index
0. Invalidation keyed off
delegate.shouldRebuild, whichSliverChildBuilderDelegatehardcodes totrue— so a theme change or a parentsetStatewas enough. It is invisible at the top of a list and brutal once the reader has scrolled. Invalidation now tracks the item count, which is what actually makes a placement wrong. - Columns did not mirror under RTL.
constraints.crossAxisDirectionwas ignored whilepaintapplies a fixed cross-axis unit vector, so column 0 stayed on the left. Flutter's own grid delegates carryreverseCrossAxisfor exactly this reason. - Spacing wider than the viewport crashed in debug.
crossAxisExtent - spacing × (columns - 1)went negative and reachedBoxConstraints.tightFor, which asserts. Clamped at zero.
Known, not fixed #
- A masonry sliver sitting entirely below the viewport's cache region reports
SliverGeometry.zero, somaxScrollExtentomits it until it is scrolled near. Two grids in oneCustomScrollViewshow it. - The catch-up walk holds every child from index 0 to the target window alive at once before releasing them, so a long jump has a memory spike.
0.2.0 #
MasonryGridView.extentandSliverMasonryGrid.extentsize the column count to the space available, the wayGridView.extentdoes, rather than taking a fixed number. A masonry grid is usually a photo feed, and a fixed count either wastes a tablet or squeezes a phone — this was the obvious gap against every other grid in Flutter.- Columns are recomputed when the viewport changes width, so a resize or a rotation relayouts rather than keeping a stale count.
0.1.1 #
Packaging only — no API or behaviour changes.
- The demo animations now ship inside the package, so they appear as screenshots on the pub.dev page rather than only in the README on GitHub.
.pubignoreexcludes the raw recorder frames, so shipping them costs about 600 KB rather than the 11 MB the frame directory would have added.
0.1.0 #
Initial release.
MasonryGridViewandSliverMasonryGrid, with.count,.listand.customconstructors.- Several
SliverMasonryGrids can share oneCustomScrollViewwithout the viewport jumping backwards — the defect flutter_staggered_grid_view#265 has been reporting since 2022. Measured head to head, the incumbent jumps twice by up to 3,400px over 45 forward drags; this does not jump. - Placements are computed once and never revised, so the sliver never issues a
scrollOffsetCorrectionand nothing already on screen can move. - The reported scroll extent uses exact measurements for everything seen and
estimates only the tail, so the scrollbar drifts by 77px where the incumbent
drifts by 3,928px and Flutter's own
SliverListdrifts by 1,340px. - Both axes,
padding,shrinkWrap,cacheExtent,findChildIndexCallbackand the rest of theBoxScrollViewsurface.
Only masonry. Aligned, quilted, woven and staired layouts are not included: they are not broken, so replacing them buys nothing.