Compreender o conceito
Versão mínima obrigatória da linguagem Dart: 3.13.
Finalidade: Declarar em uma única linha no início da classe os campos e o construtor principal, reduzindo drasticamente o código boilerplate. O comportamento em tempo de execução é idêntico aos construtores tradicionais; apenas a sintaxe foi simplificada.
- Declaring parameters (parâmetros declarativos): Parâmetros no cabeçalho da classe marcados com
var/finalgeram automaticamente campos de instância com o mesmo nome. - Non-declaring parameters (parâmetros simples): Parâmetros sem
var/finalsão apenas entradas do construtor e não criam campos da classe. - In-body constructors (construtores internos da classe): Construtores nomeados, de fábrica ou redirecionadores escritos dentro das chaves da classe.
- Regra obrigatória: Uma classe que possua construtor principal não pode ter outros construtores generativos não redirecionadores, garantindo que todas as instâncias passem obrigatoriamente pelo construtor principal.
Comparação: sintaxe tradicional vs abreviação do construtor principal
// Sintaxe tradicional com código repetido
class Point {
int x;
int y;
Point(this.x, this.y);
}
// Abreviação do construtor principal
class Point(var int x, var int y);Code language: JavaScript (javascript)
Regras de geração automática de campos
1. Com var / final
Campos de instância são criados automaticamente.
Basta escrever as variáveis de campo diretamente entre parênteses após o nome da classe.
// x e y se tornam variáveis de membro da classe automaticamente
class Point(var int x, final int y);
void main() {
final p = Point(10, 20);
print(p.x); // 10
print(p.y); // 20
// p.y = 30; // Erro de compilação: y é declarado como final
}Code language: JavaScript (javascript)
Ao executar o código acima ocorre um erro.
D:\dartdemo\firstdart\bin>dart run
Building package executable...
Failed to build firstdart:firstdart:
firstdart.dart:2:13: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
^^^
firstdart.dart:2:12: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
^
firstdart.dart:2:36: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);Code language: JavaScript (javascript)
Causa: A abreviação class Point(var int x, final int y);, chamada de Primary Constructors (construtores principais), é uma funcionalidade experimental do Dart. Ela vem desativada por padrão na versão estável atual, por isso a execução direta retorna um erro de sintaxe.
Data atual: 10 de julho de 2026, 14h55. Quando o leitor visualizar este artigo, o Dart pode ter lançado uma nova versão oficial que habilita essa sintaxe por padrão.
Use esse comando para teste temporário:
dart run --enable-experiment=primary-constructors

2. Sem var / final
São apenas parâmetros temporários, nenhum campo é gerado.
class User(String name) {
// print(name); // Acessa o parâmetro diretamente dentro da classe, mas não cria o campo this.name
final String msg = "Hi $name"; // Erro de compilação
}
void main() {
final u = User("Tom");
// print(u.name); // Erro de compilação: o campo name não existe
}Code language: JavaScript (javascript)