Fundamentos do Dart
Sintaxe é o esqueleto do código — hábitos de sintaxe padronizados determinam a legibilidade e manutenibilidade do código.
1. O que Você Aprenderá
- A função de entrada
main()e o modelo de execução do programa - Ponto e vírgula, chaves e convenções de indentação (regras do dart format)
- Três tipos de comentários: Comentários de linha / Comentários de bloco / Comentários de documentação (
///) - Visão geral de palavras-chave e palavras reservadas
- A diferença entre declarações e expressões
2. A História Real de um Desenvolvedor
(1) Dor: Falta de Comentários Torna o Código Inmanutenível
Charlie herdou um script de processamento de dados de um ex-colega sem absolutamente nenhum comentário. Entre 500 linhas de código cheias de números mágicos e nomes de variáveis abreviados, levou 3 dias para descobrir que p significava product e t significava taxRate. Pior ainda, uma lógica crítica de cálculo de impostos carecia de comentários de documentação, fazendo com que um novo colega a modificasse erroneamente, pensando que era um bug. Isso resultou em cálculos de impostos incorretos para 2.000 pedidos e uma perda financeira direta de 50.000 USD.
(2) Solução com Sintaxe Padronizada
O Dart fornece três tipos de comentários. Combinados com dart format para formatação automática e dart analyze para verificação estática, você pode escrever código estruturalmente claro e bem comentado.
/// Calcula o valor do imposto de um pedido.
///
/// Usa a taxa de imposto regional e aplica isenções
/// para pedidos abaixo do limite mínimo.
double calculateTax(double amount, double taxRate, {double exemptThreshold = 0}) {
// Aplicar limite de isenção
if (amount <= exemptThreshold) return 0;
/* Lógica complexa de cálculo de impostos
que pode abranger várias linhas */
final taxableAmount = amount - exemptThreshold;
return taxableAmount * taxRate;
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
(3) Benefícios
- Comentários de documentação podem ser gerados automaticamente como docs de API pelo
dart doc dart formatunifica o estilo de código da equipe, eliminando debates sobre formatação- Nomenclatura padronizada + comentários melhoram a manutenibilidade do código em 3 vezes
3. Estrutura do Programa e o Ponto de Entrada main
(1) Modelo de Execução do Programa
Todo programa Dart inicia a execução a partir da função main(). O Dart usa um modelo de event loop single-threaded, mas pode alcançar paralelismo através de Isolates.
graph TD
A[SO carrega Dart VM] --> B[Encontrar função main]
B --> C[Executar corpo do main]
C --> D{Tem operações assíncronas?}
D -->|Não| E[Programa encerra]
D -->|Sim| F[Event loop executa]
F --> G[Processar microtasks]
G --> H[Processar eventos]
H --> I{Mais eventos?}
I -->|Sim| G
I -->|Não| E
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Forma básica da função main
// Função main mais simples
void main() {
print('DataPipeline starting...');
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Função main com argumentos
// main com argumentos de linha de comando
void main(List<String> arguments) {
// arguments[0] é o primeiro argumento (não o nome do programa)
print('Arguments received: $arguments');
print('Argument count: ${arguments.length}');
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
| Forma do main | Assinatura | Uso |
|---|---|---|
| Sem argumentos | void main() |
Scripts simples |
| Com argumentos | void main(List<String> args) |
Ferramentas CLI |
| Com valor de retorno | Future<void> main() |
Ponto de entrada assíncrono |
4. Ponto e Vírgula, Chaves e Indentação
(1) Regras Básicas de Sintaxe
O Dart usa ponto e vírgula ; para encerrar declarações e chaves {} para delimitar blocos de código. A indentação é de 2 espaços (imposta pelo dart format).
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Ponto e vírgula e chaves
void main() {
// Cada declaração termina com ponto e vírgula
int orderCount = 1000;
double totalAmount = 50000.0;
// Corpo do bloco requer chaves
if (orderCount > 0) {
print('Processing $orderCount orders');
} else {
print('No orders to process');
}
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
| Regra | Descrição | Tratamento do dart format |
|---|---|---|
| Ponto e vírgula no final | Toda declaração deve terminar com ; |
Não adiciona automaticamente |
| Chaves | if/for/while devem usar {} |
Formata automaticamente |
| Indentação | 2 espaços de indentação | Corrige automaticamente |
| Largura de linha | Recomendado dentro de 80 caracteres | Não imposto |
5. Três Tipos de Comentários
(1) Comentários de Linha //
Usados para explicações de linha única, mais comumente usados.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Comentários de linha
void main() {
// Inicializar o pipeline de dados
final maxRecords = 1000000; // Máximo de registros para processar
// TODO: Adicionar suporte a arquivo de configuração
print('Max capacity: $maxRecords records');
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
(2) Comentários de Bloco /* */
Usados para explicações de múltiplas linhas ou para desabilitar código temporariamente.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Comentários de bloco
void main() {
/* Esta seção trata da configuração inicial
do DataPipeline.
Lê de variáveis de ambiente. */
final config = 'production';
/*
// Temporariamente desabilitado para depuração
if (config == 'production') {
enableLogging();
}
*/
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
(3) Comentários de Documentação ///
Usados para gerar documentação de API, suportando formato Markdown.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Comentários de documentação
/// Representa um pedido de e-commerce com cálculo de impostos.
///
/// Esta classe modela um único pedido do sistema
/// DataPipeline, incluindo valor, taxa de imposto e status.
///
/// Example:
/// ```dart
/// final order = Order(id: 'ORD-001', amount: 1500.0);
/// print(order.totalWithTax);
/// ```
class Order {
final String id;
final double amount;
Order({required this.id, required this.amount});
double get totalWithTax => amount * 1.08;
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
| Tipo de Comentário | Sintaxe | Propósito | Gera Documentação |
|---|---|---|---|
| Comentário de linha | // |
Explicações de código, TODOs | Não |
| Comentário de bloco | /* */ |
Explicações multi-linha, desabilitar código | Não |
| Comentário de documentação | /// |
Documentação de API | Sim (dart doc) |
6. Palavras-chave e Palavras Reservadas
(1) Classificação de Palavras-chave do Dart
| Categoria | Palavras-chave | Descrição |
|---|---|---|
| Declarações | class enum mixin extension typedef |
Declarações de tipos |
| Modificadores | abstract sealed final const late static |
Modificadores |
| Controle | if else for while do switch return |
Controle de fluxo |
| Exceções | try catch finally throw rethrow |
Tratamento de exceções |
| Assíncrono | async await sync yield |
Programação assíncrona |
| Tipos | int double String bool dynamic void |
Tipos embutidos |
| Null Safety | null late required |
Null Safety |
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Evitar usar palavras reservadas como identificadores
// Correto - use nomes descritivos
int orderCount = 100;
String customerName = 'Alice';
double taxRate = 0.08;
// Errado - evite palavras reservadas como identificadores
// int class = 5; // Erro de sintaxe!
// String function = 'test'; // Erro de sintaxe!
> Saída: Execute em um DartPad local ou with `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
7. Declarações e Expressões
(1) Diferença Central
Expressões têm um valor de retorno; declarações não. Isso é fundamental para entender a sintaxe do Dart.
graph TD A[Unidade de Código] --> B[Expressão<br/>tem valor] A --> C[Declaração<br/>sem valor] B --> B1[literal: 42] B --> B2[variável: count] B --> B3[operação: a + b] B --> B4[chamada de função: max(1, 2)] C --> C1[if-else] C --> C2[laço for] C --> C3[declaração return] C --> C4[declaração de variável]
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
▶ Exemplo
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
: Expressão vs Declaração
void main() {
// Expressões - produzem valores
int count = 100; // 100 é uma expressão
double price = 29.99; // 29.99 é uma expressão
double total = price * count; // price * count é uma expressão
bool isExpensive = total > 1000; // total > 1000 é uma expressão
// Declarações - não produzem valores
if (isExpensive) { // declaração if
print('High value order'); // declaração de chamada print
}
// Dart 3: switch expression (expressão!)
String label = switch (count) {
0 => 'empty',
<= 10 => 'small',
<= 100 => 'medium',
_ => 'large',
};
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
| Dimensão | Expressão | Declaração |
|---|---|---|
| Valor de Retorno | Sim | Não |
| Aninhamento | Pode ser aninhada em outras expressões | Executada independentemente |
| Exemplos | a + b, x > 0 |
if, for, return |
| Novo Recurso Dart 3 | switch expression | — |
8. Exemplo Completo: Template de Estilo de Código do DataPipeline
// ============================================
// DataPipeline - Template de Estilo de Código
// Demonstra sintaxe adequada, comentários e estrutura
// ============================================
/// Configuração do motor de processamento do DataPipeline.
///
/// Armazena configurações como tamanho máximo de lote,
/// formato de saída e se deve habilitar logging detalhado.
class PipelineConfig {
/// Número máximo de registros por lote de processamento.
final int batchSize;
/// Formato de saída para relatórios gerados.
final String outputFormat;
/// Habilitar logs detalhados de processamento.
final bool verbose;
/// Cria uma nova configuração de pipeline.
///
/// Tamanho de lote padrão é 10.000 registros.
/// Formato de saída padrão é 'json'.
PipelineConfig({
this.batchSize = 10000,
this.outputFormat = 'json',
this.verbose = false,
});
/// Retorna um resumo legível da configuração.
String get summary =>
'Batch: $batchSize records, Format: $outputFormat, Verbose: $verbose';
}
/// Ponto de entrada para a ferramenta CLI DataPipeline.
void main(List<String> arguments) {
// Passo 1: Carregar configuração
final config = PipelineConfig(
batchSize: 50000,
outputFormat: 'csv',
verbose: true,
);
// Passo 2: Exibir configuração
print('=== DataPipeline Configuration ===');
print(config.summary);
// Passo 3: Processar com base nos argumentos
/* TODO: Implementar processamento real de dados
- Ler fonte de entrada
- Transformar registros
- Escrever relatório de saída
*/
final recordCount = arguments.isNotEmpty ? int.tryParse(arguments[0]) ?? 0 : 0;
if (recordCount > 0) {
print('Processing $recordCount records...');
} else {
print('No records specified. Use: dart run bin/main.dart <record_count>');
}
}
> Saída: Execute em um DartPad local ou com `dart run`. Todos os exemplos do curso Dart são baseados em Dart 3.x / Flutter 3.x, e a saída pode variar ligeiramente dependendo da versão do SDK.
Saída (
dart run bin/main.dart 100000):
=== DataPipeline Configuration ===
Batch: 50000 records, Format: csv, Verbose: true
Processing 100000 records...
❓ Perguntas Frequentes
P: O ponto e vírgula é obrigatório no Dart? R: Sim, toda declaração no Dart deve terminar com ponto e vírgula, ao contrário de Python/Go onde pode ser omitido. Este é o erro mais comum de iniciantes no Dart.
P: Quando devo usar comentários de linha vs comentários de documentação? R: Para APIs públicas (classes, métodos públicos, propriedades públicas), use comentários de documentação
///. Para detalhes de implementação interna, use comentários de linha//.dart docsó processa comentários de documentação.
P: O
dart formataltera a lógica do código? R: Não.dart formatapenas ajusta espaços em branco e quebras de linha, sem alterar a semântica do código. Você pode usar--set-exit-if-changedcom confiança no CI.
P: Declarações
ifno Dart podem omitir chaves? R: Sintaticamente, se seguido por uma única declaração, as chaves podem ser omitidas. No entanto,dart formatas adicionará automaticamente. É fortemente recomendado sempre usar chaves.
P: Qual a diferença entre switch expression e switch statement? R: Uma switch expression (Dart 3) tem um valor de retorno e usa ramificações
=>. Uma switch statement não tem valor de retorno e usa ramificaçõescase:. A primeira é mais concisa; a segunda é mais flexível.
P: Devo usar
///ou/ */para comentários de documentação? R: O Dart recomenda oficialmente///. Embora/ */seja válido,///é o estilo predominante na comunidade Dart, edart formattambém formata usando///.
P: A função
mainpode retornar umint? R: O tipo de retorno demaindo Dart évoidouFuture<void>. O código de saída do processo pode ser definido usando a funçãoexit()dodart:io.
📖 Resumo
- Um programa Dart inicia a execução a partir de
main(), suportando pontos de entrada síncronos e assíncronos. - Ponto e vírgula, chaves e indentação de 2 espaços são as regras básicas de sintaxe do Dart, impostas automaticamente por
dart format. - Os três tipos de comentários cada um tem seu propósito:
//comentários de linha,/* */comentários de bloco,///comentários de documentação (para gerar docs de API). - Palavras-chave são categorizadas em 7 grandes grupos: declarações, modificadores, controle de fluxo, exceções, assíncrono, tipos e null safety.
- Expressões têm valores de retorno, declarações não — a switch expression do Dart 3 preenche essa lacuna.
📝 Exercícios
- Básico (Dificuldade ⭐): Escreva uma função
mainusando cada um dos três tipos de comentário. Executedart doc .para ver o efeito da documentação gerada. - Intermediário (Dificuldade ⭐⭐): Escreva intencionalmente algumas seções de código Dart mal formatado (indentação misturada, chaves faltando), depois use
dart formatpara corrigir automaticamente. Compare as diferenças antes e depois. - Desafio (Dificuldade ⭐⭐⭐): Escreva comentários de documentação completos (incluindo descrição, explicações de parâmetros e código de exemplo) para uma classe contendo 3 métodos. Execute
dart docpara gerar documentação HTML e revise o resultado.