For Flutter developers shipping to TalkBack, VoiceOver and the web
Semantics LensAn IconButton with no tooltip is just "button" to a screen reader. Find every barrier on one screen, then patch it.
Paste the Dart of one screen. Your browser finds unlabelled buttons and tap targets, missing button roles, images with no label, tap targets under 48 x 48, text scaling switched off, fixed heights that clip enlarged text and colours under 4.5:1 - and writes the widget test that checks the four guidelines. Then the audit, and the patched code.
The screen free
The scan free
What the scan found
Contrast the page could measure
The skill's checklist
Your widget test and checklist free
The test is the skill's proof: it fails in CI the day a target shrinks, a label goes missing or a colour drops below the ratio.
test/a11y_test.dart
The audit metered
Pricing as soon as the session is ready...
Sign inThe reply could not be read. Here it is as it came back:
Caveats
Caveats
The page's check of this reply
Saved audits
How it works - and what it cannot see
The scan reads the Dart itself: comments and strings are masked, each widget call is matched to its closing bracket and its named arguments are read at their own depth. It follows the skills' rules - a 48 x 48 target (44 on iOS), 4.5:1 contrast for small text and 3:1 for large text and icons, text that can grow to the largest OS size, Semantics with a role and a label on custom controls, MergeSemantics for composite rows, ExcludeSemantics for decoration, and the semantics tree switched on for Flutter web.
It measures only literal colours and literal sizes; colours from the theme and sizes set by layout need the widget test or a device. The audit adds what a scan cannot see - reading order, state changes, controls that need a label of their own - and the page re-scans the patched code, so a fix that did not land is flagged rather than trusted. Then swipe through the screen with TalkBack or VoiceOver.