flutter-dart-code-review
Ajuda seu agente a revisar código Flutter e Dart de forma completa. Ele verifica boas práticas, gerenciamento de estado, performance e segurança, sem focar em bibliotecas específicas.
O que ela faz
Este é um guia para revisar código Flutter e Dart. Ele verifica se o código está bem organizado, usa boas práticas de programação e evita erros comuns, independentemente da biblioteca de gerenciamento de estado usada.
Quando usar
- ✓Ao revisar o código de outra pessoa.
- ✓Antes de finalizar uma funcionalidade.
- ✓Para aprender as melhores práticas em Flutter/Dart.
Exemplo do que pedir para a IA
“Revise este código Flutter, focando nas boas práticas de organização e potenciais erros.”
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
O guia verifica a estrutura do projeto, o uso correto da linguagem Dart, as melhores práticas para criar widgets (partes visuais da tela) e como o estado (dados que mudam) é gerenciado. Ele garante que o código seja eficiente, acessível e seguro.
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 flutter-dart-code-reviewOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/flutter-dart-code-review/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.
Melhores Práticas para Revisão de Código Flutter/Dart
Checklist abrangente e independente de bibliotecas para revisar aplicações Flutter/Dart. Estes princípios se aplicam independentemente da solução de gerenciamento de estado, biblioteca de roteamento ou framework de DI utilizada.
1. Saúde Geral do Projeto
- O projeto segue uma estrutura de pastas consistente (orientada a funcionalidade ou a camadas)
- Separação adequada de responsabilidades: UI, lógica de negócios, camadas de dados
- Sem lógica de negócios em widgets; widgets são puramente de apresentação
-
pubspec.yamlestá limpo — sem dependências não utilizadas, versões fixadas apropriadamente -
analysis_options.yamlinclui um conjunto estrito de lints com configurações de analisador estritas habilitadas - Sem instruções
print()em código de produção — usedart:developerlog()ou um pacote de logging - Arquivos gerados (
.g.dart,.freezed.dart,.gr.dart) estão atualizados ou em.gitignore - Código específico da plataforma isolado por trás de abstrações
2. Armadilhas da Linguagem Dart
-
dynamicimplícito: Anotações de tipo ausentes levando adynamic— habilitestrict-casts,strict-inference,strict-raw-types - Uso indevido de segurança contra nulos: Excesso de
!(operador bang) em vez de verificações de nulo adequadas ou correspondência de padrões do Dart 3 (if (value case var v?)) - Falhas na promoção de tipo: Usando
this.fieldonde a promoção de variável local funcionaria - Capturando de forma muito ampla:
catch (e)sem cláusulaon; sempre especifique os tipos de exceção - Capturando
Error: Subtipos deErrorindicam bugs e não devem ser capturados -
asyncnão utilizado: Funções marcadas comoasyncque nuncaawait— sobrecarga desnecessária - Uso excessivo de
late:lateusado onde inicialização anulável ou de construtor seria mais segura; adia erros para o tempo de execução - Concatenação de strings em loops: Use
StringBufferem vez de+para construção iterativa de strings - Estado mutável em contextos
const: Campos em classes de construtorconstnão devem ser mutáveis - Ignorando valores de retorno de
Future: Useawaitou chame explicitamenteunawaited()para sinalizar a intenção -
varondefinalfunciona: Prefirafinalpara locais econstpara constantes em tempo de compilação - Imports relativos: Use imports
package:para consistência - Coleções mutáveis expostas: APIs públicas devem retornar visualizações não modificáveis, não
List/Mapbrutos - Falta de correspondência de padrões do Dart 3: Prefira expressões
switcheif-caseem vez de verificações verbosas deise casting manual - Classes descartáveis para múltiplos retornos: Use registros do Dart 3
(String, int)em vez de DTOs de uso único -
print()em código de produção: Usedart:developerlog()ou o pacote de logging do projeto;print()não tem níveis de log e não pode ser filtrado
3. Melhores Práticas de Widget
Decomposição de Widget:
- Nenhum widget único com um método
build()excedendo ~80-100 linhas - Widgets divididos por encapsulamento E por como eles mudam (limites de reconstrução)
- Métodos auxiliares privados de
_build*()que retornam widgets são extraídos para classes de widget separadas (permite reutilização de elementos, propagação deconste otimizações do framework) - Widgets
Statelesspreferidos sobreStatefulonde nenhum estado local mutável é necessário - Widgets extraídos estão em arquivos separados quando reutilizáveis
Uso de const:
- Construtores
constusados sempre que possível — evita reconstruções desnecessárias - Literais
constpara coleções que não mudam (const [],const {}) - O construtor é declarado
constquando todos os campos sãofinal
Uso de Key:
-
ValueKeyusado em listas/grades para preservar o estado entre reordenações -
GlobalKeyusado com moderação — apenas quando o acesso ao estado através da árvore é realmente necessário -
UniqueKeyevitado embuild()— força a reconstrução a cada frame -
ObjectKeyusado quando a identidade é baseada em um objeto de dados em vez de um único valor
Tematização e sistema de design:
- Cores vêm de
Theme.of(context).colorScheme— semColors.redcodificados ou valores hexadecimais - Estilos de texto vêm de
Theme.of(context).textTheme— semTextStyleinline com tamanhos de fonte brutos - Compatibilidade com modo escuro verificada — sem suposições sobre fundo claro
- Espaçamento e dimensionamento usam tokens de design ou constantes consistentes, não números mágicos
Complexidade do método build:
- Sem chamadas de rede, I/O de arquivo ou computação pesada em
build() - Sem trabalho de
Future.then()ouasyncembuild() - Sem criação de assinatura (
.listen()) embuild()
…
Perguntas frequentes
O que significa 'library-agnostic'?
Significa que as dicas funcionam para qualquer biblioteca de gerenciamento de estado (como BLoC, Riverpod, Provider, etc.) que você esteja usando no seu projeto Flutter.
Por que não usar `print()` no código final?
O `print()` pode poluir o log do aplicativo e não tem níveis de severidade, dificultando a identificação de mensagens importantes. É melhor usar ferramentas de log específicas.
O que são 'widgets'?
Widgets são os blocos de construção das interfaces de usuário em Flutter. Eles representam elementos visuais como textos, botões, layouts, etc.
Detalhes
Descrição original do autor
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. Use when reviewing Flutter or Dart code, whatever state management library the project uses.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #55
- 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