Focused Agent Skills for complete Flutter and Dart app delivery.
72
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Screen readers (TalkBack on Android, VoiceOver on iOS/macOS) translate Flutter's semantics tree into spoken feedback and braille output. Proper semantics configuration ensures all users can navigate and operate the app.
Flutter automatically builds a semantics tree from built-in widgets (e.g., Text, ElevatedButton, Checkbox). Only add manual Semantics widgets when custom interactive or composite components are used.
SemanticsUse to annotate custom interactive elements with label, hint, value, button flag, or custom actions:
Semantics(
button: true,
enabled: isActionable,
label: 'Add item to shopping cart',
hint: 'Double tap to activate',
onTap: onAddToCart,
child: CustomCartButton(),
)MergeSemanticsMerge a subtree of related nodes into a single semantic focus node. Essential for list tiles or cards containing an icon, title, and subtitle so the screen reader speaks the entire group together instead of forcing three separate swipes:
MergeSemantics(
child: Row(
children: [
Icon(Icons.check_circle),
SizedBox(width: 8),
Text('Order Placed'),
],
),
)ExcludeSemantics / BlockSemanticsExcludeSemantics: Hide purely decorative elements (icons with adjacent text, background illustrations, spacer art) from the screen reader to reduce audio clutter.BlockSemantics: Drop semantics behind a modal surface (dialog, bottom sheet, drawer) to prevent screen readers from focusing on backdrop widgets.To notify screen reader users of asynchronous events (e.g., "Item added to cart", "Network disconnected"):
SemanticsService.announce(
'Changes saved successfully',
Directionality.of(context),
assertiveness: Assertiveness.polite, // or Assertiveness.assertive for critical alerts
);Directionality.of(context) instead of hardcoding LTR to preserve RTL locale support.assertiveness (introduced in Flutter 3.19+; older SDKs accept only message and textDirection).tester.binding.pipelineOwner.semanticsOwner:
final handle = tester.ensureSemantics();
expect(tester.getSemantics(find.byType(CustomCartButton)), matchesSemantics(...));
handle.dispose();meetsGuideline(androidTapTargetGuideline) and meetsGuideline(iOSTapTargetGuideline) in widget tests..tessl-plugin
skills
dart-concurrency
dart-language
flutter-accessibility
flutter-ai-integration
flutter-animation
flutter-app-workflow
flutter-architecture
flutter-authentication
flutter-background-execution
flutter-build-release
flutter-ci-cd
flutter-code-review
flutter-dependency-upgrades
flutter-device-testing
flutter-figma-workflow
flutter-in-app-purchases
flutter-localization
references
flutter-networking
references
flutter-notifications
flutter-observability
flutter-openapi-client
flutter-package-development
flutter-performance
flutter-persistence
references
flutter-platform-integration
flutter-product-analytics
flutter-responsive-layout
flutter-runtime-debugging
flutter-security
flutter-state-management
flutter-testing
flutter-ui-design
flutter-ui-patterns
flutter-visual-effects