The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
Scrolling stutter in a Flutter macOS app is almost always a frame that takes longer to build or rasterize than the display allows. The reliable way to fix it is to reproduce the stutter in a profile build, find out which thread is over budget, change one suspected cause, and re-record the same scroll. This article does not identify a single change that fixed any particular app. What it gives you is the sequence that tells you which change, if any, is responsible in your own project, and how to confirm it with numbers rather than by feel.
What a scroll stutter actually measures
Flutter’s performance guidance defines the problem in frame terms. In the Flutter documentation’s words, “A frame that takes longer than 16ms to render causes jank (jerky motion) on the display device.” (Flutter, Use the Performance view) The 16 ms figure is the budget for a 60 Hz display. On a 120 Hz display the budget is shorter, roughly 8 ms per frame, so a frame that looks fine on a 60 Hz panel can still stutter on a 120 Hz one. Record which refresh rate your test machine uses, because it changes what counts as a dropped frame.
A frame’s work is split across two stages that Flutter tracks separately. The UI thread (build, layout and paint commands, plus your Dart code) prepares the frame. The raster thread turns those commands into pixels on the GPU. A stutter can come from either stage, and the fix is different for each, so the first job is to find out which one is over budget.
Step 1: Reproduce the stutter in a profile build
Debug builds run with assertions, extra checks and an unoptimized compiler, so their timings do not represent how the app performs in production. Flutter’s guidance is to “Use a profile build of your application to analyze performance.” (Flutter, Use the Performance view)
#1 Best Overall
- SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
- HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
- BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
- ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
- APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*
- Start from a scroll you can repeat exactly: the same list, the same starting position, the same drag or fling distance, and the same window size.
- Run the app in profile mode on macOS from the project root:
flutter run -d macos --profile - Open Flutter DevTools from the link the run command prints, then select the Performance view.
- Turn on the frame chart, perform the scroll, and stop. Look for frames that extend past the budget line.
The Performance view supports desktop apps, so the same workflow used for mobile applies here. (Flutter, Use the Performance view)
Step 2: Decide whether the UI thread or the raster thread is the bottleneck
Compare the UI and raster timings for the slow frames rather than relying on how the scroll looked. Flutter’s profiling guide describes using these two threads to locate where frame work concentrates. (Flutter, Flutter performance profiling) The table below maps what you see to the likely cause and where to look next.
| What the trace shows | Likely layer | Where to look next |
|---|---|---|
| UI thread frames exceed budget; raster is comfortably under it | Building, rebuilding or laying out widgets in Dart | Eager list construction, unnecessary rebuilds, intrinsic layout passes (Steps 3 and 4) |
| Raster frames exceed budget; UI is under it | Rendering work, including expensive effects and clipping | Reduce heavy visual effects inside scrolling content, then re-check raster timing |
| Both threads exceed budget | Mixed causes | Address the UI cause first, then re-profile, because a shorter UI frame can expose a raster limit |
| Stutter appears only where a native view is on screen | Platform integration | Embedded macOS views and platform-thread work (Step 5) |
Treat each row as a hypothesis to confirm, not a diagnosis. A trace narrows the search; it does not name the line of code.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #2
- FAST RUNS IN THE FAMILY — The 16-inch MacBook Pro with the M5 Pro or M5 Max chip brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. With all-day battery life, double the starting storage,* and a breathtaking Liquid Retina XDR display, it’s pro in every way.*
- BUCKLE UP — Along with a next-generation CPU, faster unified memory, and up to 2x faster SSD storage,* M5 Pro and M5 Max feature a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance and on-device training capabilities. So you can blaze through demanding workloads at mind-bending speeds.
- BUILT FOR AI — Apple silicon, and every major component that powers it, is designed to run demanding on-device AI workloads like LLM inference and training. And Apple Intelligence helps you write, express yourself, and get things done effortlessly with groundbreaking privacy protections at every step.*
- ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.*
- MACOS RUNS APPS FAST — All your go-to apps run lightning fast in macOS, including built-in apps like FaceTime and Messages. Plus, built-in virus protection and free software updates help keep your Mac running smoothly and securely.
Step 3: Check how the list is built
For long lists, the most common cause of heavy UI-thread work is building every row up front. Flutter’s scrolling guidance says that “When you have a long list of items in your ListView or GridView (including an infinite list), you can build the items on demand as they scroll into view.” (Flutter, Scrolling) Lazy builder constructors do this, and the rendering performance guide lists eager construction of a large list among common pitfalls. (Flutter, Improving rendering performance)
A list that builds all of its children at once tends to show a long first frame when the screen opens and uneven frames while scrolling. A lazy list builds only the rows near the viewport. Here is the pattern to check for:
// Eager: every item is constructed when the widget is built.
ListView(
children: [for (final item in items) ItemTile(item: item)],
);
// Lazy: items are built as they scroll into view.
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => ItemTile(item: items[index]),
);
The same applies to GridView.builder for grids. Switching from an eager list to a builder is a structural change, so it should be measured like any other change.
Rank #3
- FAST RUNS IN THE FAMILY — The 16-inch MacBook Pro with the M5 Pro or M5 Max chip brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. With all-day battery life, double the starting storage,* and a breathtaking Liquid Retina XDR display, it’s pro in every way.*
- BUCKLE UP — Along with a next-generation CPU, faster unified memory, and up to 2x faster SSD storage,* M5 Pro and M5 Max feature a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance and on-device training capabilities. So you can blaze through demanding workloads at mind-bending speeds.
- BUILT FOR AI — Apple silicon, and every major component that powers it, is designed to run demanding on-device AI workloads like LLM inference and training. And Apple Intelligence helps you write, express yourself, and get things done effortlessly with groundbreaking privacy protections at every step.*
- ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.*
- MACOS RUNS APPS FAST — All your go-to apps run lightning fast in macOS, including built-in apps like FaceTime and Messages. Plus, built-in virus protection and free software updates help keep your Mac running smoothly and securely.
Step 4: Look for rebuilds and extra layout passes
If the list is already lazy, the next suspects are work that repeats on every frame. Flutter’s documentation identifies unnecessary rebuilds and expensive layout operations as performance concerns. (Flutter, Improving rendering performance) The best-practices guide also warns about intrinsic layout passes, which make the framework measure children more than once. (Flutter, Performance best practices)
Recommended Free Tools
- Rebuild scope. A state change near the top of the tree can rebuild every row on screen. Move the state that changes during scrolling into the smallest widget that needs it.
- Intrinsic widgets inside scrolling content. Wrappers such as
IntrinsicHeightorIntrinsicWidthcan add layout passes for each visible item. Check whether a fixed or constrained size works instead. - Per-frame work in
build. Sorting, filtering, formatting or allocating large objects inside item builders runs on the UI thread for every row that appears.
Make one of these changes at a time. If two changes land together, you cannot tell which one moved the timing.
Step 5: Check for embedded native macOS views
Some Flutter macOS apps host native AppKit content through platform views. Establish first whether your app uses them at all. If it does not, this step does not apply. If it does, the platform documentation states that “any slow or blocking operations on the platform thread can negatively impact Flutter graphics performance.” (Flutter, Hosting native macOS views in your Flutter app with Platform Views)
Rank #4
- SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
- HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
- BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
- ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
- APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*
In practice, check whether scrolling stutters only when the native view is visible, and whether the platform-view code does synchronous work during the scroll. Moving that work off the platform thread, or removing the embedded view from the scrolling region, are the changes to test. Both are trade-offs: a platform view can be required for functionality you cannot reproduce in Flutter, so measure before deciding.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Step 6: Measure a change the same way every time
A single trace is an observation. A fix needs a comparison. Hold the following constant between runs: the scroll steps, the device and display refresh rate, the build mode (profile), the Flutter and Dart versions, and the data set. Then record the same statistics before and after the change.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Flutter’s metrics documentation recommends tracking average, 90th percentile, 99th percentile and worst frame build time, and it identifies build duration and raster duration as the frame metrics to watch. (Flutter, Performance metrics) Averages can hide the stutter, which lives in the tail. A change that lowers the average but leaves the 99th percentile and worst frame unchanged has not removed the visible jank.
Best Value
- SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
- HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
- BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
- ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
- APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*
For a repeatable measurement, Flutter’s integration-test recipe wraps a scroll in traceAction() and saves a performance summary, which lets you rerun the same scroll after each change. (Flutter, Measure performance with an integration test) The recipe is general Flutter guidance and is not specific to macOS, so run it on the same macOS machine you use for manual testing.
Recording the result
A before-and-after record should contain the following, so another developer can repeat it:
- The exact scroll steps and data set
- Machine model, macOS version, display refresh rate and window size
- Flutter and Dart versions, and the build mode
- Average, 90th percentile, 99th percentile and worst build and raster times, before and after
- The single change tested, and whether it was kept
If the tail values do not move, return to Step 2 and check the other thread before trying another change.
When the trace points nowhere obvious
- Frames are slow only on first open. Look at list construction and image loading. The first frame often carries setup work that later frames do not.
- The profile build is smooth but the debug build is not. This is expected. Judge the app only from profile builds.
- Timings vary between runs. Repeat the scroll several times and compare percentiles, not single frames. Close other heavy applications before measuring.
- Raster is the limit with no visible effects. Confirm that the scrolling content is the source by removing sections one at a time until the raster timing drops.
Flutter’s documentation does not provide benchmark figures for macOS scrolling, so the expected improvement from any change depends entirely on what your own trace shows.
Quick Recap
“
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

