Flutter package · v0.1.0

Edges that melt into blur.

iOS style progressive blur for scroll views, toolbars and headers. A GPU shader on the backdrop of the edge band only, so it stays cheap while everything scrolls.

flutter pub add scroll_edge_blur
Content scrolling under a progressive edge blur
Features

Just the band, nothing else.

Scroll this page and look at the top. That's the idea, done properly in Flutter with a real variable radius blur.

◐

Progressive blur

Variable radius Gaussian on any edge: top, bottom, left or right, with any Curve for the falloff.

⚡

No snapshots

Runs on the backdrop. Content is never re-rendered into an image, so lists, video and maps keep moving.

▭

Drop-in wrapper

ScrollEdgeBlur wraps a scroll view and handles layout and safe areas for you.

◫

Standalone widget

EdgeBlur works under headers, toolbars and overlays. Touches pass straight through.

◍

Frosted tint

Optional tint mixed in toward the edge, and a gradient fallback where shaders aren't available.

∅

Zero dependencies

Nothing besides Flutter itself. Requires Flutter 3.29 or newer.

Usage

Two lines to start.

Wrap your scroll view. The top edge, status bar included, blurs by default. Turn on more edges and style each one.

basic.dart
ScrollEdgeBlur(
  child: ListView(children: items),
)

// optional: load the shader before the first frame
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await EdgeBlur.precache();
  runApp(const MyApp());
}
styled.dart
ScrollEdgeBlur(
  top: const EdgeBlurStyle(extent: 72, sigma: 16),
  bottom: EdgeBlurStyle(
    extent: 110,
    tint: Theme.of(context)
        .colorScheme.surface
        .withValues(alpha: 0.5),
  ),
  child: GridView.builder(...),
)
EdgeBlurStyleDefaultWhat it does
extent96How far the blur reaches in from the edge. The safe area is added on top.
sigma16Blur strength right at the edge, in logical pixels.
curveCurves.easeInFalloff from the far side of the band to the edge.
tintnullColour mixed in toward the edge.
fallbackColornullGradient painted where the blur can't run.
Performance

Shades the band, not the screen.

400 colourful rows auto-scrolling at 900 px/s under a 140px top band, sigma 20. Average raster time per frame, lower is better.

No blurbaseline
1.2 ms
scroll_edge_blur0 of 1078 frames over 16 ms
2.0 ms
progressive_blur 0.0.211 of 1079 frames over 16 ms
5.8 ms

Measured on the iPhone 17 Pro Max simulator (iOS 26.5, Impeller, Flutter 3.47) in debug mode, so treat these as relative numbers. The blur needs Impeller; EdgeBlur.isSupported tells you at runtime.