Primary Constructors (construtores principais)

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.

  1. Declaring parameters (parâmetros declarativos): Parâmetros no cabeçalho da classe marcados com var / final geram automaticamente campos de instância com o mesmo nome.
  2. Non-declaring parameters (parâmetros simples): Parâmetros sem var/final são apenas entradas do construtor e não criam campos da classe.
  3. In-body constructors (construtores internos da classe): Construtores nomeados, de fábrica ou redirecionadores escritos dentro das chaves da classe.
  4. 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)

Previous:

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *