Variáveis
Aprenda sobre variáveis no Dart. Abaixo exemplos de criação e inicialização de variáveis:
var name = 'Jack';Code language: JavaScript (javascript)
Variáveis armazenam referências. A variável chamada name guarda uma referência que aponta para o objeto string com valor “Bob”.
Uma referência é um endereço na memória. Para facilitar o armazenamento de dados, cada área da memória recebe um endereço, parecido com o número da porta de uma casa.

O compilador infere automaticamente que o tipo de name é String, mas você também pode especificar o tipo manualmente para alterar a inferência. Se uma variável precisar armazenar objetos de vários tipos, declare seu tipo como Object (também é possível usar dynamic quando necessário).
Object name = 'Jack';Code language: JavaScript (javascript)
Outra forma é definir o tipo explicitamente (por exemplo, sabemos que um nome é texto e armazenado como String, então definimos diretamente o tipo string):
String name = 'Jack';Code language: JavaScript (javascript)
Null Safety (Segurança de nulo)
A segurança de nulo evita erros causados por acessar acidentalmente variáveis com valor null, esses erros são chamados de erro de desreferência nula (null dereference error). O erro ocorre quando você acessa uma propriedade ou chama um método em uma expressão cujo resultado é null.
Há uma exceção: se o próprio null suportar aquela propriedade ou método nativo (como toString(), hashCode), não haverá erro. Com a null safety, o compilador do Dart identifica esses possíveis erros já na fase de compilação.
Quem tem experiência com programação sabe que erros de referência nula são muito comuns. Se for possível evitar esse erro na compilação, a estabilidade e robustez do programa aumentam muito.
Exemplo: imagine que você quer pegar o valor absoluto da variável i do tipo int. Se i for null, executar i.abs() causará um erro de desreferência nula. Em outras linguagens, esse código só dará erro durante a execução; já o compilador do Dart bloqueia diretamente essa chamada ilegal e captura o problema antecipadamente.
Três alterações centrais trazidas pela null safety:
1 Tipos anuláveis: ao declarar um tipo, você controla se ele aceita valor nulo adicionando um ponto de interrogação no final do tipo.
String? name // Tipo anulável: valor pode ser null ou string
String name // Tipo não anulável: não aceita null, só armazena stringCode language: JavaScript (javascript)
Em algumas linguagens de programação, uma variável string name aceita null normalmente, mas no Dart isso não é permitido. Para aceitar null é preciso usar o tipo string?.
2 Variáveis devem ser inicializadas antes do uso. Variáveis anuláveis têm valor padrão null, equivalente a inicialização automática; tipos não anuláveis não têm valor padrão e obrigam você a atribuir um valor inicial manualmente. O Dart proíbe acessar variáveis não inicializadas para evitar problemas.
void main() {
int year; // Erro: variável não anulável sem inicializar
print(year); // Erro de compilação: year não foi inicializada
}
Code language: Dart (dart)
O código acima apresentará erro na compilação
C:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:7:9: Error: Non-nullable variable 'year' must be assigned before it can be used.
print(year); // Erro de compilação: year não inicializada
^^^^Code language: JavaScript (javascript)
Já variáveis anuláveis aceitam essa escrita:
void main() {
int? age; // Variável anulável, valor padrão null
print(age); // Exibe null sem erros
//age = 18; // Atribuição manual
//print(age); // Exibe 18
}Code language: JavaScript (javascript)
3 Não é possível acessar diretamente propriedades ou chamar métodos em expressões de tipo anulável. Novamente há exceções: métodos e propriedades nativos do null (hashCode, toString()) são permitidos.
void main() {
String? name; // Tipo anulável, valor padrão null
// Erro: acessar length diretamente causa falha
// print(name.length);
// Correto: métodos nativos de null são liberados
print(name.toString()); // Exibe "null"
print(name.hashCode); // Exibe um número inteiro
// Correto: usar operadores de segurança de nulo
print(name?.length); // Exibe null sem erros
}Code language: PHP (php)
Valores padrão
Variáveis anuláveis sem atribuição manual têm valor inicial padrão null. Até variáveis numéricas têm valor padrão null,
pois no Dart, números e todos os outros dados são objetos por natureza.
void main() {
int? lineCount;
assert(lineCount == null);
}Code language: JavaScript (javascript)
Aviso: o comando
assert()é ignorado em código de produção; durante o desenvolvimento, se a condição dentro deassert()for falsa, o programa lançará uma exceção
Com a null safety ativada, variáveis não anuláveis precisam ser inicializadas antes do uso:
int lineCount = 0;
Variáveis locais não precisam receber valor na mesma linha da declaração, mas devem ser inicializadas antes de serem usadas. O código abaixo é válido porque o Dart consegue analisar que ao executar print(), lineCount sempre terá um valor não nulo:
int lineCount;
if (weLikeToCount) {
lineCount = countLines();
} else {
lineCount = 0;
}
print(lineCount);
Code language: Dart (dart)
Observação: no código acima lineCount = countLines(); e lineCount = 0; são atribuições à variável lineCount, não “uso”. Usar significa ler o valor armazenado. Por exemplo, o código abaixo dará erro:
void main() {
int lineCount;
print(lineCount);
}
Code language: Dart (dart)
Erro de compilação

Variáveis de nível superior e membros de classe usam inicialização tardia: a lógica de atribuição só executa na primeira vez que forem acessadas.
Modificador late para variáveis
O modificador late tem dois cenários principais de uso:
- Declarar variáveis não anuláveis que receberão valor posteriormente;
- Criar inicialização tardia de variáveis.
Na maioria dos casos, a análise de fluxo do Dart consegue identificar se uma variável não anulável recebeu um valor válido antes do uso. Mas existem cenários onde essa análise falha, os mais comuns são variáveis globais e variáveis de instância: o compilador geralmente não consegue confirmar se foram inicializadas e marca erro.
Se você tem certeza que a variável receberá valor antes do uso mas o compilador não detecta, adicione o modificador late para remover o erro:
No exemplo abaixo, description é uma variável global e o compilador não consegue identificar se ela receberá valor, mas se você tem certeza absoluta que vai receber, use late:
late String description;
void main() {
description = 'Feijoada!';
print(description);
}
Code language: Dart (dart)
Aviso
Se declarar uma variável
latee nunca atribuir valor a ela, ao tentar acessá-la será lançada uma exceção em tempo de execução.
Se você atribuir um valor inicial no momento da declaração da variável late, esse código de inicialização só será executado na primeira vez que a variável for acessada. Essa inicialização tardia é muito útil em dois casos:
- A variável pode nunca ser usada e sua inicialização tem um custo computacional alto;
- Ao inicializar uma variável de instância, a lógica de inicialização precisa acessar
this.
No exemplo abaixo, se a variável temperature nunca for usada, a função de alto custo readThermometer() nunca será executada:
// A função readThermometer() só é chamada na primeira leitura de temperature
late String temperature = readThermometer(); // Inicialização tardia
Code language: JavaScript (javascript)
final e const
Se você não quiser que o valor de uma variável seja alterado, use final ou const; ambos podem ser usados isoladamente ou com anotação de tipo, substituindo o var.
- Variáveis
finalsó aceitam uma única atribuição; - Variáveis
constsão constantes de tempo de compilação (variáveisconstpossuem implicitamente o comportamento dofinal).
Aviso
Membros de instância podem ser marcados com
final, mas não comconst; constantes no escopo de classe devem usarstatic const.
Exemplos de declaração de variáveis final:
final name = 'Jack'; // Sem anotação de tipo
final String nickname = 'Jason';
Code language: PHP (php)
Não é possível alterar o valor de uma variável final, o compilador retornará erro diretamente:
void main() {
final name = 'Jack'; // Sem anotação de tipo
final String nickname = 'Jason';
name = 'Alice'; // Erro: variáveis final só aceitam uma atribuição
}Code language: JavaScript (javascript)
C:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:6:2: Error: Can't assign to the final variable 'name'.
name = 'Alice'; // Erro: variáveis final só aceitam uma atribuiçãoCode language: PHP (php)
const serve para definir constantes de compilação. Se a constante for declarada dentro de uma classe, é necessário adicionar static, formando static const. Ao declarar uma variável const, o valor atribuído deve ser determinável durante a compilação: números, literais de string, outras variáveis const ou resultados de operações aritméticas com constantes:
const bar = 1000000; // Unidade de pressão (dinas/cm²)
const double atm = 1.01325 * bar; // Pressão atmosférica padrão
Code language: JavaScript (javascript)
A palavra-chave const não serve apenas para declarar variáveis constantes, você também pode usá-la para criar objetos constantes ou definir construtores que geram instâncias constantes. Qualquer variável pode receber um objeto constante como valor.
var foo = const [];
final bar = const [];
const baz = []; // Equivalente a const []
Code language: PHP (php)
Em expressões de atribuição para variáveis const é possível omitir a palavra const, como no exemplo da variável baz acima.
Mesmo que uma variável já tenha recebido um objeto constante, se ela não for final nem const, sua referência pode ser alterada:
foo = [1, 2, 3]; // foo apontava originalmente para um array vazio constante, agora troca de referência
Code language: JavaScript (javascript)
Mas variáveis const não permitem reatribuição, o compilador dará erro:
// Erro de análise estática
baz = [42]; // Erro: variáveis const não aceitam reatribuição
Code language: JavaScript (javascript)
Ao definir constantes, é possível usar verificação de tipo, conversão de tipo (is, as), if dentro de coleções e operadores de expansão (..., ...?):
void main() {
const Object i = 3; // i é uma constante do tipo Object que guarda valor int
const list = [i as int]; // Uso de conversão de tipo
const map = {if (i is int) i: 'int'}; // Uso de is e if em coleção
const set = {if (list is List<int>) ...list}; // Combinado com operador de expansão
}Code language: JavaScript (javascript)
Aviso
A referência de um objeto marcado com
finalnão pode ser alterada, mas os campos internos do objeto podem ser modificados; por outro lado, um objetoconste todos os seus dados internos são totalmente imutáveis.
Para saber mais sobre criação de coleções constantes com const, consulte a documentação de listas, mapas e classes.
* Variáveis curinga
Observação de versão: variáveis curinga exigem Dart 3.7 ou superior.
Variáveis curinga com nome _ são variáveis locais/parâmetros sem vínculo, funcionam apenas como marcadores de posição. Se houver uma expressão de inicialização, ela será executada, mas você não consegue ler o valor armazenado na variável. No mesmo escopo é possível declarar várias variáveis chamadas _ sem conflito de nomes.
O que é variável curinga?
No Dart, o underline único _ é a variável curinga:
- Usada para receber valores que você não vai utilizar, avisando ao compilador “não vou ler nem usar essa variável”;
- O compilador não gera aviso de “variável declarada mas não usada”;
- Não é possível ler
_(causa erro), só serve para descartar dados.
// Pegamos apenas o 1º e 3º valor, o segundo é descartado com _
final [a, _, c] = [10, 20, 30];
print(a); // 10
print(c); // 30
// print(_); // Erro, não se pode ler a variável curingaCode language: PHP (php)
Não é permitido usar variáveis curinga em declarações de nível superior nem em membros de classe que afetam a privacidade da biblioteca. Apenas dentro de escopos de bloco, exemplos abaixo:
- Declaração de variáveis locais
void main() {
var _
Previous: Exemplo Dart Hello WorldNext: Operadores em Dart