dart-flutter-patterns
Faz seu agente escrever código para apps Dart e Flutter. Ele usa padrões modernos para criar apps robustos e fáceis de gerenciar.
O que ela faz
Este guia oferece exemplos de código prontos para usar em Dart e Flutter. Ele ensina como organizar seu código seguindo boas práticas para segurança contra nulos, gerenciamento de estado, navegação e mais.
Quando usar
- ✓Ao começar um novo projeto Flutter.
- ✓Ao precisar de um padrão para gerenciar dados ou navegação.
- ✓Ao revisar código para garantir que segue as melhores práticas.
Exemplo do que pedir para a IA
“Como posso gerenciar o estado da minha aplicação Flutter de forma eficiente usando BLoC ou Riverpod?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele fornece blocos de código que você pode copiar e colar, organizados por temas como segurança contra nulos, estado imutável, gerenciamento de estado e navegação.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add affaan-m/ECC --skill dart-flutter-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/dart-flutter-patterns/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões Dart/Flutter
Quando Usar
Use esta habilidade quando:
- Iniciar um novo recurso Flutter e precisar de padrões idiomáticos para gerenciamento de estado, navegação ou acesso a dados
- Revisar ou escrever código Dart e precisar de orientação sobre segurança contra nulos (null safety), tipos selados (sealed types) ou composição assíncrona (async composition)
- Configurar um novo projeto Flutter e escolher entre BLoC, Riverpod ou Provider
- Implementar clientes HTTP seguros, integração WebView ou armazenamento local
- Escrever testes para widgets Flutter, Cubits ou provedores Riverpod
- Conectar GoRouter com guardas de autenticação
Como Funciona
Esta habilidade fornece padrões de código Dart/Flutter prontos para copiar e colar, organizados por preocupação:
- Segurança contra nulos (Null safety) — evite
!, prefira?./??/correspondência de padrões (pattern matching) - Estado imutável — classes seladas (sealed classes),
freezed,copyWith - Composição assíncrona (Async composition) —
Future.waitconcorrente,BuildContextseguro apósawait - Arquitetura de Widgets — extrair para classes (não métodos), propagação de
const, reconstruções com escopo (scoped rebuilds) - Gerenciamento de estado — eventos BLoC/Cubit, notifiers Riverpod e provedores derivados
- Navegação — GoRouter com guardas de autenticação reativos via
refreshListenable - Rede (Networking) — Dio com interceptores, atualização de token com guarda de retentativa única (one-time retry guard)
- Tratamento de erros — captura global,
ErrorWidget.builder, conexão com crashlytics - Testes — unidade (teste BLoC), widget (substituições de ProviderScope), fakes em vez de mocks
Exemplos
// Sealed state — prevents impossible states
sealed class AsyncState<T> {}
final class Loading<T> extends AsyncState<T> {}
final class Success<T> extends AsyncState<T> { final T data; const Success(this.data); }
final class Failure<T> extends AsyncState<T> { final Object error; const Failure(this.error); }
// GoRouter with reactive auth redirect
final router = GoRouter(
refreshListenable: GoRouterRefreshStream(authCubit.stream),
redirect: (context, state) {
final authed = context.read<AuthCubit>().state is AuthAuthenticated;
if (!authed && !state.matchedLocation.startsWith('/login')) return '/login';
return null;
},
routes: [...],
);
// Riverpod derived provider with safe firstWhereOrNull
@riverpod
double cartTotal(Ref ref) {
final cart = ref.watch(cartNotifierProvider);
final products = ref.watch(productsProvider).valueOrNull ?? [];
return cart.fold(0.0, (total, item) {
final product = products.firstWhereOrNull((p) => p.id == item.productId);
return total + (product?.price ?? 0) * item.quantity;
});
}
Padrões práticos e prontos para produção para aplicações Dart e Flutter. Independentes de bibliotecas sempre que possível, com cobertura explícita dos pacotes mais comuns do ecossistema.
1. Fundamentos de Segurança Contra Nulos (Null Safety)
Prefira Padrões em Vez do Operador Bang (!)
// BAD — crashes at runtime if null
final name = user!.name;
// GOOD — provide fallback
final name = user?.name ?? 'Unknown';
// GOOD — Dart 3 pattern matching (preferred for complex cases)
final display = switch (user) {
User(:final name, :final email) => '$name <$email>',
null => 'Guest',
};
// GOOD — guard early return
String getUserName(User? user) {
if (user == null) return 'Unknown';
return user.name; // promoted to non-null after check
}
Evite o Uso Excessivo de late
// BAD — defers null error to runtime
late String userId;
// GOOD — nullable with explicit initialization
String? userId;
// OK — use late only when initialization is guaranteed before first access
// (e.g., in initState() before any widget interaction)
late final AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 300));
}
2. Estado Imutável
Classes Seladas (Sealed Classes) para Hierarquias de Estado
sealed class UserState {}
final class UserInitial extends UserState {}
final class UserLoading extends UserState {}
final class UserLoaded extends UserState {
const UserLoaded(this.user);
final User user;
}
final class UserError extends UserState {
const UserError(this.message);
final String message;
}
// Exhaustive switch — compiler enforces all branches
Widget buildFrom(UserState state) => switch (state) {
UserInitial() => const SizedBox.shrink(),
UserLoading() => const CircularProgressIndicator(),
UserLoaded(:final user) => UserCard(user: user),
UserError(:final message) => ErrorText(message),
};
Freezed para Imutabilidade Sem Código Repetitivo (Boilerplate-Free)
…
Perguntas frequentes
O que é 'null safety'?
É um recurso do Dart que ajuda a evitar erros comuns que acontecem quando uma variável que deveria ter um valor está vazia (nula).
O que significa 'estado imutável'?
Significa que, uma vez que um dado é criado, ele não pode ser alterado diretamente. Para mudar, você cria uma nova versão desse dado, o que torna o código mais previsível.
Quais gerenciadores de estado são cobertos?
Os mais populares: BLoC/Cubit, Riverpod e Provider.
Detalhes
Descrição original do autor
Production-ready Dart and Flutter patterns covering null safety, immutable state with Freezed, async composition, widget architecture, state management (BLoC, Riverpod, Provider), GoRouter navigation with auth guards, Dio networking, error handling, and testing. Use when writing or reviewing Dart and Flutter code — state, widgets, navigation, networking, or architecture.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #36
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
flutter-animating-apps
Faz seu agente adicionar efeitos animados e transições em aplicativos Flutter. É útil para criar movimento e design visual em apps para iOS e Android.
nexu-io/open-design
add-app-clip
Faz seu agente adicionar um App Clip do iOS a um app Expo. É útil para criar versões leves de apps que são abertas por links.
sickn33/agentic-awesome-skills
android-dev
Ajuda a desenvolver aplicativos Android. Cobre diferentes formas de criar apps, nativos ou multiplataforma.
sickn33/agentic-awesome-skills