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á


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.

DART
/// 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;
}
TEXT
> 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


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.

100%
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
TEXT
> 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

TEXT
> 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

DART
// Função main mais simples
void main() {
  print('DataPipeline starting...');
}
TEXT
> 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

TEXT
> 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

DART
// 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}');
}
TEXT
> 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

TEXT
> 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

DART
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');
  }
}
TEXT
> 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

TEXT
> 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

DART
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');
}
TEXT
> 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

TEXT
> 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

DART
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();
  }
  */
}
TEXT
> 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

TEXT
> 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

DART
/// 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;
}
TEXT
> 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

TEXT
> 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

DART
// 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!
TEXT
> 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.

100%
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]
TEXT
> 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

TEXT
> 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

DART
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',
  };
}
TEXT
> 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

DART
// ============================================
// 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>');
  }
}
TEXT
> 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):

TEXT
=== 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 doc só processa comentários de documentação.

P: O dart format altera a lógica do código? R: Não. dart format apenas ajusta espaços em branco e quebras de linha, sem alterar a semântica do código. Você pode usar --set-exit-if-changed com confiança no CI.

P: Declarações if no Dart podem omitir chaves? R: Sintaticamente, se seguido por uma única declaração, as chaves podem ser omitidas. No entanto, dart format as 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ções case:. 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, e dart format também formata usando ///.

P: A função main pode retornar um int? R: O tipo de retorno de main do Dart é void ou Future<void>. O código de saída do processo pode ser definido usando a função exit() do dart:io.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Escreva uma função main usando cada um dos três tipos de comentário. Execute dart doc . para ver o efeito da documentação gerada.
  2. Intermediário (Dificuldade ⭐⭐): Escreva intencionalmente algumas seções de código Dart mal formatado (indentação misturada, chaves faltando), depois use dart format para corrigir automaticamente. Compare as diferenças antes e depois.
  3. 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 doc para gerar documentação HTML e revise o resultado.

← Aula Anterior | Próxima Aula →

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%