Best fit
- Library-agnostic Flutter/Dart code review checklist covering widget best practices, state management patterns (BLoC, Riverpod, Provider, GetX, MobX, Signals), Dart idioms, performance, accessibility, security, and clean architecture.
affaan-m/ECC
Library-agnostic Flutter/Dart code review checklist covering widget best practices, state management patterns (BLoC, Riverpod, Provider, GetX, MobX, Signals), Dart idioms, performance, accessibility, security, and clean architecture.
npx skills add https://github.com/affaan-m/ECC --skill "skills/flutter-dart-code-review"Source checked Jul 28, 2026·Refresh due Oct 26, 2026
Reorganized from the pinned upstream SKILL.md
According to the pinned SKILL.md from affaan-m/ECC: Comprehensive, library-agnostic checklist for reviewing Flutter/Dart applications. These principles apply regardless of which state management solution, routing library, or DI framework is used.
npx skills add https://github.com/affaan-m/ECC --skill "skills/flutter-dart-code-review"Best fit
Bring this context
Expected outputs
Key source sections
Sections are extracted automatically from the pinned SKILL.md and link back to the source.
[ ] const constructors used wherever possible — prevents unnecessary rebuilds
[ ] ValueKey used in lists/grids to preserve state across reorders
[ ] Check pub points score (aim for 130+/160)
[ ] Localization solution configured (Flutter's built-in ARB/l10n, easylocalization, or equivalent)
[ ] Localization accessor used consistently throughout the project
SkillSignal prompt templates
These prompts were written by SkillSignal from the source structure; they are not upstream text.
Task-start prompt
Confirm source fit, inputs, and outputs before acting.
Use flutter-dart-code-review to help me with: [specific task]. Context: [files, data, or background]. Constraints: [environment, scope, and prohibited actions]. Before acting, check the pinned SKILL.md and explain which sections apply, what inputs are still missing, and what you will deliver.
Source-guided execution
Make the Agent explicitly follow the key extracted sections.
Apply the pinned flutter-dart-code-review source to [task]. Pay particular attention to these source sections: “Const usage:”, “Key usage:”, “10. Package/Dependency Review”, “Setup:”, “Code review:”. Preserve the important decision at each step. Mark facts not covered by the source as “needs confirmation” instead of inventing them. Then verify the result against my acceptance criteria: [criteria].
Result-review prompt
Check omissions, permissions, and source drift before delivery.
Review the current flutter-dart-code-review result: (1) does it satisfy the original task; (2) were any applicable steps or limits in the pinned SKILL.md missed; (3) did it perform any unauthorized file, command, network, or data action; and (4) which conclusions remain unverified? List issues first, then fix only what the source or user authorization supports.
Output checklist
The task matches the purpose documented in the SKILL.md.
The source section “Const usage:” has been checked.
The source section “Key usage:” has been checked.
The source section “10. Package/Dependency Review” has been checked.
The source section “Setup:” has been checked.
Inputs, constraints, and acceptance criteria are explicit.
Unverified facts, compatibility, and outcome claims are clearly marked.
Any file, command, network, or data action has been reviewed.
Choose a different workflow
Umbrella workflow for 67 public skills: Full Send, copy, design, code review, SEO, launch packaging, MCP QA, iOS and Android app shipping, and creator workflows. Loads the full public skill pack.
A separate implementation from JasonColapietro/suede-creator-skills; compare its source, maintenance signals, and permission requirements.
Open source detailPython design patterns including KISS, Separation of Concerns, Single Responsibility, and composition over inheritance. Use this skill when designing a new service or component from scratch and choosing how to layer responsibilities, when refactoring a God class or monolithic function that has grown too large, when deciding whether to add a new abstraction or live with duplication, when evaluating a pull request for structural issues like tight coupling or leaking internal types, when choosing b
A separate implementation from wshobson/agents; compare its source, maintenance signals, and permission requirements.
Open source detailCopilot left 14 review comments on your PR — half are nits. Hours of fix → reply → resolve → re-request, and each round lands MORE comments. This skill runs loop engineering: auto-triggers Copilot Code Review via GraphQL (no @copilot mention), triages every open thread (Copilot, humans, advanced-security) with a fix / decline / escalate rubric, dispatches parallel fix sub-agents that obey the repo build/test/lint conventions, commits per iteration, replies+resolves citing the pushed SHA, then re
A separate implementation from github/awesome-copilot; compare its source, maintenance signals, and permission requirements.
Open source detailFAQ
Comprehensive, library-agnostic checklist for reviewing Flutter/Dart applications. These principles apply regardless of which state management solution, routing library, or DI framework is used.
The catalog detected this source-specific install command: npx skills add https://github.com/affaan-m/ECC --skill "skills/flutter-dart-code-review". Inspect the command and pinned source before running it.
No dedicated Agent platform is declared in the pinned source record.
Quality breakdown
Based on traceable docs and repository signals; stars are not treated as quality.
Compare before choosing
These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.
Umbrella workflow for 67 public skills: Full Send, copy, design, code review, SEO, launch packaging, MCP QA, iOS and Android app shipping, and creator workflows. Loads the full public skill pack.
Python design patterns including KISS, Separation of Concerns, Single Responsibility, and composition over inheritance. Use this skill when designing a new service or component from scratch and choosing how to layer responsibilities, when refactoring a God class or monolithic function that has grown too large, when deciding whether to add a new abstraction or live with duplication, when evaluating a pull request for structural issues like tight coupling or leaking internal types, when choosing b
Copilot left 14 review comments on your PR — half are nits. Hours of fix → reply → resolve → re-request, and each round lands MORE comments. This skill runs loop engineering: auto-triggers Copilot Code Review via GraphQL (no @copilot mention), triages every open thread (Copilot, humans, advanced-security) with a fix / decline / escalate rubric, dispatches parallel fix sub-agents that obey the repo build/test/lint conventions, commits per iteration, replies+resolves citing the pushed SHA, then re
Find the bugs a diff can actually ship: TypeScript, React, Next.js, OWASP, accessibility, SEO, database, and deploy-risk review. Return findings, not a grade.
Use when writing, validating, or preparing ANY contribution or pull request to the JSONbored/metagraphed repo — adding/enriching a subnet's public surfaces (the most common contribution), a code/schema change to the Worker API or build scripts, picking an issue, running the local gates, and formatting the commit + PR. metagraphed reviews PRs ONE-SHOT via the Gittensory Gate (the GitHub App that auto-merges/auto-closes) plus a strict CI suite; there is no review back-and-forth, so a PR must be co
Comprehensive, library-agnostic checklist for reviewing Flutter/Dart applications. These principles apply regardless of which state management solution, routing library, or DI framework is used.
pubspec.yaml is clean — no unused dependencies, versions pinned appropriatelyanalysis_options.yaml includes a strict lint set with strict analyzer settings enabledprint() statements in production code — use dart:developer log() or a logging package.g.dart, .freezed.dart, .gr.dart) are up-to-date or in .gitignoredynamic — enable strict-casts, strict-inference, strict-raw-types! (bang operator) instead of proper null checks or Dart 3 pattern matching (if (value case var v?))this.field where local variable promotion would workcatch (e) without on clause; always specify exception typesError: Error subtypes indicate bugs and should not be caughtasync: Functions marked async that never await — unnecessary overheadlate overuse: late used where nullable or constructor initialization would be safer; defers errors to runtimeStringBuffer instead of + for iterative string buildingconst contexts: Fields in const constructor classes should not be mutableFuture return values: Use await or explicitly call unawaited() to signal intentvar where final works: Prefer final for locals and const for compile-time constantspackage: imports for consistencyList/Mapif-case over verbose is checks and manual casting(String, int) instead of single-use DTOsprint() in production code: Use dart:developer log() or the project's logging package; print() has no log levels and cannot be filteredbuild() method exceeding ~80-100 lines_build*() helper methods that return widgets are extracted to separate widget classes (enables element reuse, const propagation, and framework optimizations)const constructors used wherever possible — prevents unnecessary rebuildsconst literals for collections that don't change (const [], const {})const when all fields are finalValueKey used in lists/grids to preserve state across reordersGlobalKey used sparingly — only when accessing state across the tree is truly neededUniqueKey avoided in build() — it forces rebuild every frameObjectKey used when identity is based on a data object rather than a single valueTheme.of(context).colorScheme — no hardcoded Colors.red or hex valuesTheme.of(context).textTheme — no inline TextStyle with raw font sizesbuild()Future.then() or async work in build().listen()) in build()setState() localized to smallest possible subtreeThese principles apply to all Flutter state management solutions (BLoC, Riverpod, Provider, GetX, MobX, Signals, ValueNotifier, etc.).
ref.watch is expected — flag only circular or overly tangled chainscopyWith() or constructors, never mutated in-place== and hashCode properly (all fields included in comparison)Equatable, freezed, Dart records, or otherList/Map@action in MobX, .value on signals, .obs in GetX) — direct field mutation bypasses change trackingReactionDisposer in MobX, effect cleanup in Signals)AsyncValue) — not boolean flags (isLoading, isError, hasData)// BAD — boolean flag soup allows impossible states
class UserState {
bool isLoading = false;
bool hasError = false; // isLoading && hasError is representable!
User? user;
}
// GOOD (immutable approach) — sealed types make impossible states unrepresentable
sealed class UserState {}
class UserInitial extends UserState {}
class UserLoading extends UserState {}
class UserLoaded extends UserState {
final User user;
const UserLoaded(this.user);
}
class UserError extends UserState {
final String message;
const UserError(this.message);
}
// GOOD (reactive approach) — observable enum + data, mutations via reactivity API
// enum UserStatus { initial, loading, loaded, error }
// Use your solution's observable/signal to wrap status and data separately
const widgets used to stop rebuild propagation through the tree.listen()) are cancelled in dispose() / close().listen())mounted check before setState in async callbacksBuildContext not used after await without checking context.mounted (Flutter 3.7+) — stale context causes crashesBuildContext never stored in singletons, state managers, or static fieldssetState, ValueNotifier)setState() not called at root widget level — localize state changesconst widgets used to stop rebuild propagationRepaintBoundary used around complex subtrees that repaint independentlyAnimatedBuilder child parameter used for subtrees independent of animationbuild() — compute in state management layerbuild()MediaQuery.of(context) usage is specific (e.g., MediaQuery.sizeOf(context))Image.asset with cacheWidth/cacheHeight to decode at display sizeListView.builder / GridView.builder used instead of ListView(children: [...]) for large or dynamic lists (concrete constructors are fine for small, static lists)deferred as) used for heavy libraries in web buildsOpacity widget avoided in animations — use AnimatedOpacity or FadeTransitionoperator == not overridden on widgets — use const constructors insteadIntrinsicHeight, IntrinsicWidth) used sparingly (extra layout pass)pumpWidget and pump used correctly for async operationsfind.byType, find.text, find.byKey used appropriatelypumpAndSettle or explicit pump(Duration)Semantics widget used to provide screen reader labels where automatic labels are insufficientExcludeSemantics used for purely decorative elementsMergeSemantics used to combine related widgets into a single accessible elementsemanticLabel property setonPressed callbacks — every button does something or is disabledSafeArea widgetAndroidManifest.xml and Info.plistLayoutBuilder or MediaQuery used for responsive layoutsFlexible, Expanded, FittedBox--dart-define, .env files excluded from VCS, or compile-time configuration.gitignore^1.2.3) for dependencies — allows compatible updatesflutter pub outdated regularly to track stale dependenciespubspec.yaml — only for temporary fixes with a comment/issue linkpackage:other/src/internal.dart (breaks Dart package encapsulation)path: ../../ relative stringsanalysis_options.yamlNavigator.push with a declarative routerMap<String, dynamic> or Object? castingFlutterError.onError overridden to capture framework errors (build, layout, paint)PlatformDispatcher.instance.onError set for async errors not caught by FlutterErrorWidget.builder customized for release mode (user-friendly instead of red screen)runApp (e.g., runZonedGuarded, Sentry/Crashlytics wrapper)if checksanalysis_options.yaml present with strict settings enabledstrict-casts: true, strict-inference: true, strict-raw-types: true// ignore:) are justified with comments explaining whyflutter analyze runs in CI and failures block mergesprefer_const_constructors — performance in widget treesavoid_print — use proper loggingunawaited_futures — prevent fire-and-forget async bugsprefer_final_locals — immutability at variable levelalways_declare_return_types — explicit contractsavoid_catches_without_on_clauses — specific error handlingalways_use_package_imports — consistent import styleThe table below maps universal principles to their implementation in popular solutions. Use this to adapt review rules to whichever solution the project uses.
| Principle | BLoC/Cubit | Riverpod | Provider | GetX | MobX | Signals | Built-in |
|---|---|---|---|---|---|---|---|
| State container | Bloc/Cubit | Notifier/AsyncNotifier | ChangeNotifier | GetxController | Store | signal() | StatefulWidget |
| UI consumer | BlocBuilder | ConsumerWidget | Consumer | Obx/GetBuilder | Observer | Watch | setState |
| Selector | BlocSelector/buildWhen | ref.watch(p.select(...)) | Selector | N/A | computed | computed() | N/A |
| Side effects | BlocListener | ref.listen | Consumer callback | ever()/once() | reaction | effect() | callbacks |
| Disposal | auto via BlocProvider | .autoDispose | auto via Provider | onClose() | ReactionDisposer | manual | dispose() |
| Testing | blocTest() | ProviderContainer | ChangeNotifier directly | Get.put in test | store directly | signal directly | widget test |