Dart: Introdução à Linguagem Dart — Da Origem ao Ecossistema
Dart — Uma linguagem nascida para multiplataforma, do Flutter ao CLI, da Web ao Servidor, uma base de código roda em todo lugar.
1. O que Você Aprenderá
- O contexto de criação do Dart e o posicionamento estratégico do Google
- Diferenças principais entre Dart vs JavaScript / TypeScript / Kotlin
- Os três pilares do Dart 3: Null Safety / Pattern Matching / Sealed Classes
- O panorama do ecossistema Dart: pub.dev / Flutter / lado servidor / CLI
- Visão geral do projeto DataPipeline do Bob e roteiro de aprendizagem
2. A História de um Desenvolvedor Real
(1) Dor: O Pesadelo da Fragmentação no Desenvolvimento Multiplataforma
Bob é um desenvolvedor full-stack responsável por um produto SaaS de análise de dados de e-commerce. Ele precisa manter simultaneamente um frontend web (JavaScript), aplicativos móveis (Kotlin + Swift), serviços de backend (Go) e ferramentas CLI (Python). Quatro linguagens, quatro toolchains, quatro bases de código — corrigir um único bug exige alterações em quatro lugares. Quando o gerente de produto solicitou um "painel em tempo real", Bob teve que ponderar repetidamente entre Flutter e desenvolvimento nativo, com os custos de comunicação da equipe disparando para 20 horas por semana.
(2) A Solução do Dart
O Dart oferece uma stack tecnológica unificada: uma linguagem cobre o frontend (Flutter Web), mobile (Flutter Mobile), backend (Dart shelf) e CLI (dart:io). Bob reescreveu todo o projeto em Dart, e a lógica de negócio principal só precisa ser escrita uma vez.
// Lógica de negócio compartilhada - roda em CLI, Web, Mobile, Server
class DataPipeline {
final String name;
final int maxRecords;
const DataPipeline({
required this.name,
this.maxRecords = 1000000,
});
String get summary => '$name: 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 os resultados podem variar ligeiramente com a versão do SDK.
(3) Benefícios
- A taxa de reuso de código aumentou de 30% para 85%
- A equipe só precisa dominar uma linguagem, reduzindo os custos de comunicação em 60%
- O Null Safety do Dart 3 reduziu as exceções de ponteiro nulo em tempo de execução em 95%
3. O Nascimento e a Evolução do Dart
(1) Contexto de Criação
O Dart foi lançado em 2011 por Lars Bak e Kasper Lund do Google, inicialmente concebido para substituir o JavaScript como a linguagem principal da web. O surgimento do Flutter em 2015 mudou o destino do Dart — transformando-o de uma "linguagem Web" para uma "linguagem multiplataforma."
graph LR A[Dart 1.0<br/>2011] --> B[Dart 2.0<br/>2018<br/>Tipagem forte] B --> C[Dart 2.12<br/>2021<br/>Null Safety] C --> D[Dart 3.0<br/>2023<br/>Records/Pattern/Sealed] D --> E[Dart 3.x<br/>2024+<br/>Wasm GC]
> **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 os resultados podem variar ligeiramente com a versão do SDK.
| Marco de Versão | Ano | Recurso Principal | Significado |
|---|---|---|---|
| Dart 1.0 | 2011 | Tipagem opcional | Alternativa para Web |
| Dart 2.0 | 2018 | Strong mode + tipagem estática | Fundação da segurança de tipos |
| Dart 2.12 | 2021 | Sound Null Safety | Elimina ponteiros nulos |
| Dart 3.0 | 2023 | Records / Pattern Matching / Sealed Classes | Recursos de linguagem moderna |
| Dart 3.x | 2024+ | Suporte a Wasm GC | Salto de desempenho na Web |
(2) Posicionamento Estratégico do Google
O Dart é a única linguagem oficial do Flutter e também é a linguagem da camada de aplicação do Fuchsia OS interno do Google. O investimento do Google no Dart é uma estratégia de longo prazo, não um projeto experimental.
| Dimensão Estratégica | Posicionamento |
|---|---|
| Mobile | Linguagem principal do Flutter |
| Web | Compila para JS / Wasm para execução |
| Desktop | Flutter Desktop |
| Lado servidor | shelf / dart:io |
| Embarcado | Camada de aplicação do Fuchsia OS |
4. Dart vs Outras Linguagens
(1) Comparação das Diferenças Principais
graph LR A[Dart] --> B[Null Safety] A --> C[Pattern Matching] A --> D[Sealed Classes] A --> E[AOT + JIT] A --> F[Concorrência Isolate] G[JavaScript] --> H[Tipagem dinâmica] G --> I[Thread única] J[TypeScript] --> K[Type erasure] J --> L[Sem tipos em tempo de execução] M[Kotlin] --> N[Dependente da JVM] M --> O[Coroutines]
> **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 os resultados podem variar ligeiramente com a versão do SDK.
| Dimensão | Dart | JavaScript | TypeScript | Kotlin |
|---|---|---|---|---|
| Sistema de Tipos | Estático Sound | Dinâmico | Estático (apagado) | Estático |
| Null Safety | Sound (tempo de compilação) | Nenhum | Não obrigatório | Não obrigatório |
| Compilação AOT | Suportado | Não suportado | Não suportado | Suportado (Native) |
| Modelo de Concorrência | Isolate (sem memória compartilhada) | Thread única | Thread única | Coroutines |
| Pattern Matching | Nativo do Dart 3 | Nenhum | Nenhum | Suporte limitado |
| Sealed Classes | Nativo do Dart 3 | Nenhum | Nenhum | Suportado |
| Suporte Flutter | Único oficial | Nenhum | Nenhum | Indireto (KMP) |
| Curva de Aprendizado | Média | Baixa | Média | Média |
(2) Vantagens Exclusivas do Dart
- Sound Null Safety: O compilador garante que tipos não anuláveis nunca serão nulos, ao contrário do TS que verifica apenas em tempo de compilação.
- Isolate: Paralelismo real sem memória compartilhada, evitando condições de corrida.
- Modo Dual AOT + JIT: JIT hot reload durante desenvolvimento, AOT de alto desempenho para release.
- Tríade de Recursos do Dart 3: Records / Pattern Matching / Sealed Classes lançados juntos.
5. Os Três Pilares do Dart 3
(1) Null Safety
O Sound Null Safety divide os tipos em anuláveis T? e não anuláveis T. O compilador garante em tempo de compilação que tipos não anuláveis nunca serão nulos.
// Não anulável - compilador garante não-nulo
String name = 'Bob';
// Anulável - deve verificar antes de usar
String? nickname = null;
// Acesso seguro
int length = nickname?.length ?? 0;
> **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 os resultados podem variar ligeiramente com a versão do SDK.
(2) Pattern Matching
O Dart 3 introduziu um sistema completo de pattern matching, suportando desestruturação, if-case, switch expressions e verificações exhaustivas.
// Switch expression com pattern matching
String describe(Object value) => switch (value) {
int i => 'Integer: $i',
double d => 'Double: $d',
String s => 'String: $s',
_ => 'Unknown type',
};
> **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 os resultados podem variar ligeiramente com a versão do SDK.
(3) Sealed Classes
Uma sealed class restringe as subclasses à mesma biblioteca, permitindo que o compilador garanta a exaustividade do switch.
sealed class DataSource {}
class ApiSource extends DataSource { final String endpoint; ApiSource(this.endpoint); }
class FileSource extends DataSource { final String path; FileSource(this.path); }
class DatabaseSource extends DataSource { final String connectionString; DatabaseSource(this.connectionString); }
// Switch exhaustivo - compilador verifica todos os casos
String describe(DataSource source) => switch (source) {
ApiSource(:final endpoint) => 'API: $endpoint',
FileSource(:final path) => 'File: $path',
DatabaseSource(:final connectionString) => 'DB: $connectionString',
};
> **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 os resultados podem variar ligeiramente com a versão do SDK.
| Recurso | Problema Resolvido | Cenário de Exemplo |
|---|---|---|
| Null Safety | Exceções de ponteiro nulo em tempo de execução | Itens de configuração opcionais, retornos de API anuláveis |
| Pattern Matching | Cadeias if-else verbosas | Verificação de tipos, desestruturação de dados |
| Sealed Classes | Esquecer de tratar um ramo | Tipos de fonte de dados, máquinas de estado |
6. Panorama do Ecossistema Dart
(1) Componentes Principais do Ecossistema
graph LR A[Ecossistema Dart] --> B[Flutter<br/>Mobile/Desktop/Web] A --> C[pub.dev<br/>Registro de Pacotes] A --> D[Lado Servidor<br/>shelf/dart:io] A --> E[Ferramentas CLI<br/>args/dart:io] A --> F[Web<br/>dart2js/dart2wasm] A --> G[Testes<br/>pacote test] A --> H[Geração de Código<br/>build_runner]
> **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 os resultados podem variar ligeiramente com a versão do SDK.
| Componente do Ecossistema | Propósito | Pacotes Representativos |
|---|---|---|
| Flutter | Framework de UI | flutter, cupertino |
| pub.dev | Gerenciador de Pacotes | 40.000+ pacotes |
| Lado servidor | Serviços HTTP | shelf, dart_frog |
| CLI | Ferramentas de Linha de Comando | args, cli_util |
| Web | Compilação Frontend | dart2js, dart2wasm |
| Testes | Framework de Testes | test, mockito |
| Geração de Código | Geração de Código | build_runner, json_serializable |
▶ 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 os resultados podem variar ligeiramente com a versão do SDK.
: Busca de pacotes no pub.dev
Bob busca por pacotes relacionados a processamento de dados no pub.dev:
// Dependências do pubspec.yaml para o DataPipeline
// dependencies:
// args: ^2.4.2 # Parsing de argumentos CLI
// http: ^1.2.0 # Cliente HTTP
// csv: ^6.0.0 # Parsing de CSV
// sqlite3: ^2.4.0 # Banco de dados SQLite
// path: ^1.9.0 # Manipulação de caminhos
> **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 os resultados podem variar ligeiramente com a versão do SDK.
7. Visão Geral do Projeto DataPipeline do Bob
(1) Definição do Projeto
DataPipeline é uma ferramenta CLI de análise de dados de e-commerce desenvolvida por Bob, que processa milhões de registros de pedidos para gerar relatórios utilizáveis por um painel SaaS.
▶ 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 os resultados podem variar ligeiramente com a versão do SDK.
: Visão do Projeto
// Visão geral do projeto DataPipeline
// Entrada: 1.2M pedidos de e-commerce (CSV / API / Banco de Dados)
// Processamento: Filtrar, agregar, transformar em paralelo
// Saída: Relatórios prontos para painel (JSON / CSV / HTML)
void main() {
print('DataPipeline v1.0.0');
print('Capacidade de processamento: 1.000.000+ pedidos');
print('Formatos de saída: JSON, CSV, HTML');
}
> **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 os resultados podem variar ligeiramente com a versão do SDK.
(2) Roteiro de Aprendizagem
graph TD
subgraph Phase1[Fase 1: Fundamentos]
L1[Aula 1: Introdução]
L2[Aula 2: Instalação]
L3[Aula 3: Sintaxe Básica]
L4[Aula 4: Variáveis e Tipos]
L5[Aula 5: Operadores]
L6[Aula 6: Fluxo de Controle]
end
subgraph Phase2[Fase 2: Recursos Principais]
L7[Aula 7: Funções]
L8[Aula 8: Classes e Objetos]
L9[Aula 9: Coleções]
L10[Aula 10: Tratamento de Exceções]
L11[Aula 11: Generics]
L12[Aula 12: Enums e Extensions]
end
subgraph Phase3[Fase 3: Avançado]
L13[Aula 13: Null Safety]
L14[Aula 14: Future / async-await]
L15[Aula 15: Stream]
L16[Aula 16: Recursos do Dart 3]
L17[Aula 17: Isolates]
L18[Aula 18: Metaprogramação]
end
subgraph Phase4[Fase 4: Operações]
L19[Aula 19: Gerenciamento de Pacotes]
L20[Aula 20: Testes]
L21[Aula 21: Geração de Código]
L22[Aula 22: Dart e Flutter]
end
subgraph Phase5[Fase 5: Projeto]
L23[Aula 23: Design de Projeto]
L24[Aula 24: Otimização e Release]
end
Phase1 --> Phase2 --> Phase3 --> Phase4 --> Phase5
> **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 os resultados podem variar ligeiramente com a versão do SDK.
| Fase | Aulas | Objetivo | Resultado Principal |
|---|---|---|---|
| Fase 1 | L1-L6 | Fundamentos | Hello World → Fluxo de controle |
| Fase 2 | L7-L12 | Recursos Principais | Funções/Classes/Coleções/Exceções/Generics/Enums |
| Fase 3 | L13-L18 | Recursos Avançados | Null Safety/Async/Stream/Dart 3/Isolates |
| Fase 4 | L19-L22 | Gerenciamento e Operações | Gerenciamento de Pacotes/Testes/Geração de Código/Flutter |
| Fase 5 | L23-L24 | Prática Integrada | Projeto DataPipeline completo |
▶ 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 os resultados podem variar ligeiramente com a versão do SDK.
: Código de preview do DataPipeline
// Preview do DataPipeline - o que você vai construir
void main() {
// Passo 1: Definir fonte de dados
final source = ApiSource('https://api.example.com/orders');
// Passo 2: Criar pipeline
final pipeline = DataPipeline(
name: 'E-Commerce Analytics',
maxRecords: 1200000,
);
// Passo 3: Processar e gerar saída
print(pipeline.summary);
// Saída: E-Commerce Analytics: capacity 1200000 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 os resultados podem variar ligeiramente com a versão do SDK.
8. Exemplo Completo: Esqueleto do Projeto DataPipeline
// ============================================
// Esqueleto do Projeto DataPipeline
// Uma ferramenta CLI para análise de dados de e-commerce
// ============================================
// Tipos de fonte de dados (sealed class para matching exhaustivo)
sealed class DataSource {}
class ApiSource extends DataSource {
final String endpoint;
ApiSource(this.endpoint);
}
class FileSource extends DataSource {
final String path;
FileSource(this.path);
}
// Classe principal do pipeline
class DataPipeline {
final String name;
final int maxRecords;
DataSource? source; // anulável - pode não estar configurado ainda
DataPipeline({
required this.name,
this.maxRecords = 1000000,
});
String get summary => '$name: capacity ${maxRecords} records';
String describeSource() {
if (source == null) return 'No source configured';
return switch (source!) {
ApiSource(:final endpoint) => 'API source: $endpoint',
FileSource(:final path) => 'File source: $path',
};
}
}
// Ponto de entrada
void main() {
final pipeline = DataPipeline(
name: 'E-Commerce Analytics',
maxRecords: 1200000,
);
pipeline.source = ApiSource('https://api.example.com/orders');
print('=== DataPipeline ===');
print(pipeline.summary);
print(pipeline.describeSource());
}
> **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 os resultados podem variar ligeiramente com a versão do SDK.
Saída:
=== DataPipeline ===
E-Commerce Analytics: capacity 1200000 records
API source: https://api.example.com/orders
❓ Perguntas Frequentes
P: Qual é a relação entre Dart e Flutter? R: Dart é a única linguagem de programação oficial do Flutter, que é um framework de UI construído com Dart. Aprender Dart é um pré-requisito para aprender Flutter.
P: O Dart pode substituir o JavaScript no desenvolvimento frontend? R: O Dart pode ser compilado para JavaScript via dart2js ou para WebAssembly via dart2wasm. No entanto, o ecossistema web ainda é dominado por JS. A força do Dart está no Flutter para a web.
P: O Null Safety do Dart 3 é obrigatório? R: Sim, o Dart 3 ativa o Sound Null Safety por padrão. Código legado precisa de migração, mas a migração gradual é suportada desde o Dart 2.12.
P: O Dart é adequado para desenvolvimento de backend? R: Sim. O Dart possui frameworks de backend como shelf e dart_frog, e seu modelo de concorrência Isolate pode lidar com cenários de alta concorrência. No entanto, seu ecossistema não é tão maduro quanto o de Go/Java.
P: É difícil aprender Dart se eu já tenho experiência com TypeScript? R: Não é difícil. Dart e TS têm sistemas de tipos semelhantes, mas o Sound Null Safety e o Isolate do Dart são conceitos novos que exigem aprendizado focado.
P: Como é o desempenho do Dart? R: Após a compilação AOT, o desempenho é próximo ao de Go/Java. O modo JIT suporta desenvolvimento com hot-reload. O suporte a Wasm GC melhora significativamente o desempenho na web.
P: Como é a qualidade dos pacotes no pub.dev? R: O pub.dev possui um sistema de pontuação de qualidade (pub points) que cobre suporte a plataformas, cobertura de documentação, etc. Pacotes populares como http e args são de alta qualidade, mas pacotes de nicho devem ser avaliados individualmente.
📖 Resumo
- O Dart foi lançado pelo Google em 2018. O Dart 2.0 estabeleceu a tipagem forte, e o Dart 3 introduziu seus três pilares em 2023.
- Os três pilares do Dart 3: Null Safety (elimina ponteiros nulos), Pattern Matching (desestruturação de tipos), Sealed Classes (verificações exhaustivas).
- Diferenças principais entre Dart vs JS/TS/Kotlin: Sistema de tipos Sound, concorrência Isolate, modo dual AOT+JIT.
- O ecossistema Dart cobre cinco áreas principais: Flutter, pub.dev, Lado Servidor, CLI e Web.
- O projeto DataPipeline do Bob abrangerá 24 aulas, do Hello World a uma ferramenta CLI completa.
- Roteiro de aprendizagem: 5 Fases de iniciante a aplicação prática, progredindo passo a passo.
📝 Exercícios
- Básico (Dificuldade ⭐): Visite pub.dev, busque pelo pacote
http, verifique sua pontuação pub points e registre a lista de plataformas suportadas. - Intermediário (Dificuldade ⭐⭐): Compare o Dart com a linguagem de programação que você mais conhece (JS/Python/Java, etc.), liste 3 vantagens e 3 desvantagens do Dart e escreva uma breve tabela de comparação.
- Desafio (Dificuldade ⭐⭐⭐): Esboce um diagrama de divisão de módulos para o projeto DataPipeline, considerando quais componentes são necessários para as três etapas: entrada de dados, processamento e saída.