Dart Language Patterns
SkillAI & modelsDart 3.x language feature standards: null safety, records, sealed classes, switch pattern matching, extensions, and async/await. Use when using !, ?., ??, late, sealed classes, record types, switch expressions, or async patterns — and before introducing any new Dart 3.x construct to confirm the modern idiomatic approach.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Dart Language Patterns skill
What this skill tells your AI
The instructions your AI receives, as published by hoangnguyen0403/agent-skills-standard in skills/dart/dart-language/SKILL.md and read by ahel’s review.
Priority: P0 (CRITICAL)
Implementation Guidelines
- Null Safety: Avoid
!. Use?.,??, or short-circuiting. Uselateonly if necessary. - Immutability: Use
finalfor all variables. Use@freezedfor data classes. - Pattern Matching (3.x): Use
switch (value)with patterns and destructuring. - Records: Use a Record (e.g.,
(String, int)) for multiple values; use named fields when meaning matters. Destructure at call sites:final (error, data) = fetchUser();. - Sealed Classes: Use
sealed classfor exhaustive state handling in domain logic. - Extensions: Use
extensionto add utility methods to third-party types. - Wildcards (3.7+): Use
_for unused variables in declarations and patterns. - Tear-offs: Prefer using tear-offs (e.g.,
list.forEach(print)) over anonymous lambdas (e.g.,list.forEach((e) => print(e))). - Asynchrony: Prefer
async/awaitover rawFuture.then. Useunawaitedfor fire-and-forget logic if necessary. - Encapsulation: Use
_prefix for library-private members. Preferfinalproperties. - Collections: Use
collection-if,collection-for, and spread operators.... - Safe List Access: Prefer
.firstOrNull,.lastOrNull, or.elementAtOrNull(i). - No dynamic: Use
Objector generics instead ofdynamic. - Type Aliases: Use
typedeffor complex IDs or callbacks.
Anti-Patterns
- No ! Operator: not use bang operator
!unless you can prove value non-null viaiforassert. - No var for members: not use
varfor class members; usefinalor explicit types. - No logic in constructors: not perform complex calculations or async work inside constructors.
- No zero-arg methods for pure computations: Use a getter.
int get invoiceType =>notint toInvoiceType(). - No generic conversion names: Name value-object converters for their target context:
get apiFilterTypenotget invoiceType.
Code
// Sealed class and Switch expression
sealed class Result {}
class Success extends Result { final String data; Success(this.data); }
class Failure extends Result {}
String message(Result r) => switch (r) {
Success(data: var d) => "Got $d",
Failure() => "Error",
};
References
- feature-based-clean-architecture | tooling
Null-safety checklist
- Replace
!with?-aware access, explicit narrowing, or a guard clause; do not silence nullability with a force unwrap.
Canonical response anchors
When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
- Replace ! with ?
- destructure,destructuring,final (error,result.error
Signals
- GitHub stars
- 565
- Forks
- 164
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
dart-language- Source
- github.com/hoangnguyen0403/agent-skills-standard