flutter-accessibility — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited flutter-accessibility (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Design layouts to accommodate dynamic scaling and high visibility. Flutter automatically calculates font sizes based on OS-level accessibility settings.
maximum OS settings. Avoid hardcoding fixed heights on text containers.
or 14pt+ bold) to meet W3C standards.
Utilize Flutter's catalog of accessibility widgets to manipulate the semantics tree exposed to assistive technologies (like TalkBack or VoiceOver).
Semantics: Use this to annotate the widget tree with a description of the meaning of the widgets. Assign specificroles using the SemanticsRole enum (e.g., button, link, heading) when building custom components.
MergeSemantics: Wrap composite widgets to merge the semantics of all descendants into a single selectable node forscreen readers.
ExcludeSemantics: Use this to drop the semantics of all descendants, hiding redundant or purely decorativesub-widgets from accessibility tools.
Flutter web renders UI on a single canvas, requiring a specialized DOM layer to expose structure to browsers.
invisible button (aria-label="Enable accessibility") so users can turn it on. Do not rely on that opt-in. To honor accessible-by-default, force semantics generation at startup for every web target using the ensureSemantics() pattern below. Treat the invisible-button fallback as a backstop, not the norm.
SemanticsBinding.instance.ensureSemantics() in main() (guarded by kIsWeb) on allweb builds, not only web-first apps. See the example below.
TabBar, MenuAnchor, Table) for automatic ARIA role mapping. Forcustom components, explicitly assign SemanticsRole values to ensure screen readers interpret the elements correctly.
Differentiate between adaptive and responsive paradigms to build universal applications.
touch vs. mouse/keyboard) to make the UI usable within the current device context. Design to the strengths of each form factor.
#### Task Progress: Accessibility Implementation Copy this checklist to track accessibility compliance during UI development:
Semantics and assign the appropriate SemanticsRole.MergeSemantics to prevent screen reader fatigue.ExcludeSemantics.ensureSemantics() (the default for all web targets, not just web-first apps).
#### Feedback Loop: Accessibility Validation Run this loop when finalizing a view or component:
Semantics, adjust constraints, or modify colors. Repeat until the screen reader provides a clear,logical traversal of the UI.
#### Programmatic Web Accessibility Enablement On every web target, initialize the semantics binding before running the app so accessibility is on by default.
import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter/foundation.dart';
void main() {
if (kIsWeb) {
SemanticsBinding.instance.ensureSemantics();
}
runApp(const MyApp());
}#### Custom Component Semantics If building a custom widget that acts as a list item, explicitly define its semantic role so assistive technologies and web ARIA mappings interpret it correctly.
Semantic labels are user-facing strings: source them from localized strings via AppLocalizations, never hardcoded literals. Pass the already-localized value into the widget (as text is here), so the Semantics(label: ...) reads from the translation rather than a literal.
import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
class CustomListItem extends StatelessWidget {
final String text;
const CustomListItem({super.key, required this.text});
@override
Widget build(BuildContext context) {
return Semantics(
role: SemanticsRole.listItem,
label: text,
child: Padding(
padding: const EdgeInsets.all(12.0), // Ensures > 48px tap target if interactive
child: Text(
text,
style: const TextStyle(fontSize: 16), // Ensure contrast ratio > 4.5:1
),
),
);
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.