Dart Efetivo
Melhores práticas para construir bibliotecas Dart consistentes, fáceis de manter e eficientes.
Ao longo dos últimos anos, escrevemos uma tonelada de código Dart e aprendemos muito sobre o que funciona bem e o que não funciona. Estamos compartilhando isso com você para que você possa escrever código consistente, robusto e rápido também. Existem dois temas abrangentes:
-
Seja consistente. Quando se trata de coisas como formatação e casing, argumentos sobre qual é melhor são subjetivos e impossíveis de resolver. O que sabemos é que ser consistente é objetivamente útil.
Se dois pedaços de código parecem diferentes, deveria ser porque eles são diferentes de alguma forma significativa. Quando um pedaço de código se destaca e chama sua atenção, deveria fazê-lo por uma razão útil.
-
Seja breve. Dart foi projetado para ser familiar, então herda muitas das mesmas instruções e expressões de C, Java, JavaScript e outras linguagens. Mas criamos Dart porque há muito espaço para melhorar o que essas linguagens oferecem. Adicionamos um monte de recursos, desde interpolação de strings até initializing formals, para ajudá-lo a expressar sua intenção de forma mais simples e fácil.
Se houver várias maneiras de dizer algo, você geralmente deve escolher a mais concisa. Isso não quer dizer que você deva fazer code golf e espremer um programa inteiro em uma única linha. O objetivo é um código que seja econômico, não denso.
Os guias
#Dividimos as diretrizes em algumas páginas separadas para facilitar a digestão:
-
Style Guide – Define as regras para dispor e organizar código, ou pelo menos as partes que o
dart formatnão trata para você. O guia de estilo também especifica como os identificadores são formatados:camelCase,using_underscores, etc. -
Documentation Guide – Diz tudo o que você precisa saber sobre o que vai dentro dos comentários. Tanto comentários de documentação quanto comentários de código normais e comuns.
-
Usage Guide – Ensina como fazer o melhor uso dos recursos da linguagem para implementar comportamento. Se está em uma instrução ou expressão, é coberto aqui.
-
Design Guide – Este é o guia mais suave, mas aquele com o escopo mais amplo. Abrange o que aprendemos sobre projetar APIs consistentes e utilizáveis para bibliotecas. Se está em uma assinatura de tipo ou declaração, este guia cobre isso.
Para links para todas as diretrizes, consulte o resumo.
Como ler os guias
#Cada guia é dividido em algumas seções. As seções contêm uma lista de diretrizes. Cada diretriz começa com uma destas palavras:
-
As diretrizes DO descrevem práticas que devem sempre ser seguidas. Quase nunca haverá uma razão válida para se desviar delas.
-
As diretrizes DON'T são o inverso: coisas que quase nunca são uma boa ideia. Felizmente, não temos tantas dessas quanto outras linguagens têm porque temos menos bagagem histórica.
-
As diretrizes PREFER são práticas que você deve seguir. No entanto, pode haver circunstâncias em que faz sentido fazer o contrário. Apenas certifique-se de entender completamente as implicações de ignorar a diretriz quando o fizer.
-
As diretrizes AVOID são o dual de "prefer": coisas que você não deveria fazer, mas onde pode haver boas razões para fazê-lo em raras ocasiões.
-
As diretrizes CONSIDER são práticas que você pode ou não querer seguir, dependendo das circunstâncias, precedentes e sua própria preferência.
Algumas diretrizes descrevem uma exception onde a regra não se aplica. Quando listadas, as exceções podem não ser exaustivas—você ainda pode precisar usar seu julgamento em outros casos.
Isso soa como se a polícia fosse derrubar sua porta se você não tiver os cadarços amarrados corretamente. As coisas não são tão ruins. A maioria das diretrizes aqui são de senso comum e todos somos pessoas razoáveis. O objetivo, como sempre, é ter um código agradável, legível e de fácil manutenção.
O analisador Dart fornece um linter para ajudá-lo a escrever código bom e consistente que segue essas e outras diretrizes. Se uma ou mais regras do linter existem que podem ajudá-lo a seguir uma diretriz, então a diretriz vincula a essas regras. Os links usam o seguinte formato:
ia-translate: true ---Regra do linter: unnecessary_getters_setters
Para aprender como usar o linter, consulte Habilitando regras do linter e a lista de regras do linter.
Glossário
#Para manter as diretrizes breves, usamos alguns termos abreviados para nos referir a diferentes construções Dart.
-
Um library member é um field, getter, setter ou function de nível superior. Basicamente, qualquer coisa no nível superior que não seja um tipo.
-
Um class member é um constructor, field, getter, setter, function ou operator declarado dentro de uma classe. Os membros de classe podem ser instance ou static, abstract ou concrete.
Um member é um library member ou um class member.
-
Uma variable, quando usada de forma geral, refere-se a variáveis de nível superior, parâmetros e variáveis locais. Não inclui fields static ou instance.
Um type é qualquer declaração de tipo nomeada: uma class, typedef ou enum.
-
Uma property é uma variável de nível superior, getter (dentro de uma classe ou no nível superior, instance ou static), setter (o mesmo) ou field (instance ou static). Basicamente qualquer construção nomeada semelhante a um "field".
Resumo de todas as regras
#Style
#Identificadores
-
FAÇA nomear tipos usando
UpperCamelCase. -
FAÇA nomear extensões usando
UpperCamelCase. -
FAÇA nomear pacotes, diretórios e arquivos-fonte usando
lowercase_with_underscores. -
FAÇA nomear prefixos de import usando
lowercase_with_underscores. -
FAÇA nomear os demais identificadores usando
lowerCamelCase. -
PREFIRA usar
lowerCamelCasepara nomes de constantes. - FAÇA escrever com maiúscula siglas e abreviações com mais de duas letras, como palavras.
- PREFIRA usar curingas para parâmetros de callback não usados.
- NÃO use underscore inicial em identificadores que não são privados.
- NÃO use letras de prefixo.
- NÃO nomeie bibliotecas explicitamente.
Ordenação
-
FAÇA colocar imports
dart:antes dos outros imports. -
FAÇA colocar imports
package:antes dos imports relativos. - FAÇA especificar exports em uma seção separada, depois de todos os imports.
- FAÇA ordenar as seções em ordem alfabética.
Formatação
Documentation
#Comentários
Comentários de documentação
-
FAÇA usar comentários de documentação
///para documentar membros e tipos. - PREFIRA escrever comentários de documentação para APIs públicas.
- CONSIDERE escrever um comentário de documentação no nível da biblioteca.
- CONSIDERE escrever comentários de documentação para APIs privadas.
- FAÇA começar comentários de documentação com um resumo de uma frase.
- FAÇA separar a primeira frase de um comentário de documentação em seu próprio parágrafo.
- EVITE redundância com o contexto ao redor.
- PREFIRA começar comentários de funções ou métodos com verbos na terceira pessoa se o propósito principal for um efeito colateral.
- PREFIRA começar o comentário de uma variável ou propriedade não booleana com um sintagma nominal.
- PREFIRA começar o comentário de uma variável ou propriedade booleana com "Whether" seguido de um sintagma nominal ou gerundial.
- PREFIRA um sintagma nominal ou verbal não imperativo para uma função ou método se retornar um valor for seu propósito principal.
- NÃO escrever documentação para o getter e o setter de uma propriedade.
- PREFIRA começar comentários de biblioteca ou de tipo com sintagmas nominais.
- CONSIDERE incluir exemplos de código em comentários de documentação.
- FAÇA usar colchetes em comentários de documentação para se referir a identificadores no escopo.
- FAÇA usar texto corrido para explicar parâmetros, valores de retorno e exceções.
- FAÇA colocar comentários de documentação antes das anotações de metadados.
Markdown
- EVITE usar markdown em excesso.
- EVITE usar HTML para formatação.
- PREFIRA cercas de crase para blocos de código.
Escrita
Usage
#Bibliotecas
-
FAÇA usar strings em diretivas
part of. -
NÃO importe bibliotecas que estão dentro do diretório
srcde outro pacote. -
NÃO permita que um caminho de import alcance dentro ou fora de
lib. - PREFIRA caminhos de import relativos.
Null
-
NÃO inicialize variáveis explicitamente para
null. -
NÃO use um valor padrão explícito de
null. -
NÃO use
trueoufalseem operações de igualdade. -
EVITE variáveis
latese você precisar verificar se elas foram inicializadas. - CONSIDERE promoção de tipo ou padrões de verificação de null para usar tipos nullable.
Strings
- FAÇA usar strings adjacentes para concatenar literais de string.
- PREFIRA usar interpolação para compor strings e valores.
- EVITE usar chaves na interpolação quando não forem necessárias.
Coleções
- FAÇA usar literais de coleção sempre que possível.
-
NÃO use
.lengthpara verificar se uma coleção está vazia. -
EVITE usar
Iterable.forEach()com um literal de função. -
NÃO use
List.from()a menos que você pretenda mudar o tipo do resultado. -
FAÇA usar
whereType()para filtrar uma coleção por tipo. -
NÃO use
cast()quando uma operação próxima resolver. - EVITE usar
cast().
Funções
- FAÇA usar uma declaração de função para vincular uma função a um nome.
- NÃO crie uma lambda quando um tear-off resolver.
Variáveis
-
FAÇA seguir uma regra consistente para
varefinalem variáveis locais. - EVITE armazenar o que você pode calcular.
Membros
- NÃO envolva um campo em um getter e setter sem necessidade.
-
PREFIRA usar um campo
finalpara criar uma propriedade somente leitura. -
CONSIDERE usar
=>para membros simples. -
NÃO use
this.exceto para redirecionar a um construtor nomeado ou para evitar sombreamento. - FAÇA inicializar campos na sua declaração sempre que possível.
Construtores
- FAÇA usar parâmetros inicializadores sempre que possível.
-
NÃO use
latequando uma lista de inicializadores do construtor resolver. -
FAÇA usar
;em vez de{}para corpos de construtor vazios. - PREFIRA usar a sintaxe concisa de construtores.
- NÃO use
new. -
NÃO use
constde forma redundante.
Tratamento de erros
-
EVITE capturas sem cláusulas
on. -
NÃO descarte erros em capturas sem cláusulas
on. -
FAÇA lançar objetos que implementam
Errorapenas para erros de programação. -
NÃO capture explicitamente
Errorou tipos que o implementam. -
FAÇA usar
rethrowpara relançar uma exceção capturada.
Assincronia
Design
#Nomes
- FAÇA usar termos consistentemente.
- EVITE abreviações.
- PREFIRA colocar o substantivo mais descritivo por último.
- CONSIDERE fazer o código ler como uma sentença.
- PREFIRA uma frase substantiva para uma propriedade ou variável não-booleana.
- PREFIRA uma frase verbal não-imperativa para uma propriedade ou variável booleana.
- CONSIDERE omitir o verbo para um parâmetro booleano nomeado.
- PREFIRA o nome "positivo" para uma propriedade ou variável booleana.
- PREFIRA uma frase verbal imperativa para uma função ou método cujo principal propósito é um efeito colateral.
- PREFIRA uma frase substantiva ou frase verbal não-imperativa para uma função ou método se retornar um valor é seu propósito principal.
- CONSIDERE uma frase verbal imperativa para uma função ou método se você quer chamar atenção para o trabalho que realiza.
-
EVITE iniciar um nome de método com
get. -
PREFIRA nomear um método
to___()se ele copia o estado do objeto para um novo objeto. -
PREFIRA nomear um método
as___()se ele retorna uma representação diferente apoiada pelo objeto original. - EVITE descrever os parâmetros no nome da função ou método.
- FAÇA seguir as convenções mnemônicas existentes ao nomear parâmetros de tipo.
Bibliotecas
Classes e mixins
- EVITE definir uma classe abstrata de um membro quando uma função simples serve.
- EVITE definir uma classe que contém apenas membros estáticos.
- EVITE estender uma classe que não é destinada a ser subclasse.
- FAÇA usar modificadores de classe para controlar se sua classe pode ser estendida.
- EVITE implementar uma classe que não é destinada a ser uma interface.
- FAÇA usar modificadores de classe para controlar se sua classe pode ser uma interface.
-
PREFIRA definir um
mixinpuro ouclasspura a ummixin class.
Construtores
Membros
-
PREFIRA tornar campos e variáveis de nível superior
final. - FAÇA usar getters para operações que conceitualmente acessam propriedades.
- FAÇA usar setters para operações que conceitualmente mudam propriedades.
- NÃO defina um setter sem um getter correspondente.
- EVITE usar testes de tipo em tempo de execução para falsificar sobrecarga.
-
EVITE campos
late finalpúblicos sem inicializadores. -
EVITE retornar tipos
Future,Stream, e coleção anuláveis. -
EVITE retornar
thisde métodos apenas para habilitar uma interface fluente.
Tipos
- FAÇA anotar o tipo de variáveis sem inicializadores.
- FAÇA anotar o tipo de campos e variáveis de nível superior se o tipo não é óbvio.
- NÃO anote redundantemente o tipo de variáveis locais inicializadas.
- FAÇA anotar tipos de retorno em declarações de função.
- FAÇA anotar tipos de parâmetros em declarações de função.
- NÃO anote tipos de parâmetros inferidos em expressões de função.
- NÃO anote o tipo de formals inicializadores.
- FAÇA escrever argumentos de tipo em invocações genéricas que não são inferidas.
- NÃO escreva argumentos de tipo em invocações genéricas que são inferidas.
- EVITE escrever tipos genéricos incompletos.
-
FAÇA anotar com
dynamicem vez de deixar a inferência falhar. - PREFIRA assinaturas em anotações de tipo de função.
- NÃO especifique um tipo de retorno para um setter.
- NÃO use a sintaxe typedef legada.
- PREFIRA tipos de função inline a typedefs.
- PREFIRA usar sintaxe de tipo de função para parâmetros.
-
EVITE usar
dynamica menos que você queira desabilitar verificação estática. -
FAÇA usar
Future<void>como tipo de retorno de membros assíncronos que não produzem valores. -
EVITE usar
FutureOr<T>como tipo de retorno.
Parâmetros
- EVITE parâmetros booleanos posicionais.
- EVITE parâmetros posicionais opcionais se o usuário pode querer omitir parâmetros anteriores.
- EVITE parâmetros obrigatórios que aceitam um valor especial de "sem argumento".
- FAÇA usar parâmetros de início inclusivo e fim exclusivo para aceitar um intervalo.
Igualdade
Salvo indicação em contrário, a documentação neste site reflete Dart 3.13.7. Página atualizada pela última vez em 2026-11-12. Ver código-fonte ou relatar um problema.
Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.