Artigo original: Constructors in Dart – Use Cases and Examples
A maioria de nós está familiarizada com o conceito de construtores. Eles nos permitem criar diferentes instâncias de nossas classes. Podemos especificar de quais parâmetros a classe deve depender quando ela está sendo instanciada e ocultar a lógica de inicialização interna.
Podemos ter muitos construtores para diferentes casos de uso ou podemos confiar no padrão.
No Dart, os construtores desempenham um papel semelhante, mas há muitas variações que não existem na maioria das linguagens de programação. Este artigo abordará os diferentes casos de uso e exemplos de construtores.
Em todos os exemplos deste artigo, usaremos a classe a seguir:
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
}
Como começar a usar construtores no Dart
Se você não especificar um construtor no Dart, ele criará um construtor padrão para você.
Isso não significa que você verá um construtor padrão gerado em sua classe. Em vez disso, ao criar uma nova instância de sua classe, esse construtor será chamado. Ele não terá argumentos e chamará o construtor da superclasse, sem argumentos também.
Para declarar um construtor em sua classe, você pode fazer o seguinte:
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
Carro(String fabricante, String modelo, int ano, bool comABS) {
this.fabricante = fabricante;
this.modelo = modelo;
this.anoFabricacao = ano;
this.comABS = comABS;
}
}
Como você pode imaginar, deve haver um modo melhor de inicializar os campos da nossa classe – no Dart, fazemos isso assim:
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
Carro(this.fabricante, this.modelo, this.anoFabricacao, this.comABS);
}
A maneira que usamos acima simplifica a sintaxe do Dart para realizar a tarefa.

Recursos mais complexos do construtor
Em outras linguagens, é possível sobrecarregar seu construtor. Isso significa que você pode ter construtores diferentes com o mesmo nome, mas com uma assinatura variável (ou um conjunto diferente de argumentos).
Construtores nomeados em Dart
Em Dart, isso não é possível, mas há uma maneira de contornar isso. É chamada de construtores nomeados. Dar nomes diferentes aos seus construtores permite que sua classe tenha muitos construtores e represente melhor seus casos de uso fora da classe.
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
Carro(this.fabricante, this.modelo, this.anoFabricacao, this.comABS);
Carro.semABS(this.fabricante, this.modelo, this.anoFabricacao): comABS = false;
}
O construtor semABS inicializa a variável de instância comABS como false, antes que o corpo do construtor seja executado. Isso é conhecido como uma lista de inicializadores e você pode inicializar diversas variáveis, separadas por uma vírgula.
O caso de uso mais comum para listas de inicializadores é inicializar campos finais declarados por sua classe.
✋ Tudo o que for colocado no lado direito dos dois-pontos (:) não tem acesso ao this
Construtores "de fábrica" no Dart
Um construtor de fábrica é um construtor que pode ser usado quando você não deseja necessariamente que um construtor crie uma instância de sua classe.
Isso pode ser útil se você mantiver instâncias de sua classe na memória e não quiser criar uma outra a cada vez (ou se a operação de criação de uma instância for cara).
Outro caso de uso é se você tiver determinada lógica em seu construtor para inicializar um campo final que não pode ser feito na lista inicializadora.
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
factory Carro.ford(String modelo, String anoFabricacao, bool comABS) {
return CarroFord(modelo, anoFabricacao, comABS);
}
}
class CarroFord extends Carro {
CarroFord(String modelo, String anoFabricacao, bool comABS): super("Ford", modelo, anoFabricacao, comABS);
}
Construtores avançados no Dart
Construtores constantes e construtores de redirecionamento no Dart
O Dart também permite que você crie construtores constantes. O que isso significa exatamente? Se sua classe representa um objeto que nunca será alterado após sua criação, você pode se beneficiar do uso de um construtor constante. Você tem que se certificar de que todos os seus campos de classe são finais.
class FordFocus {
static const FordFocus fordFocus = FordFocus("Ford", "Focus", "2013", true);
final String fabricante;
final String modelo;
final String anoFabricacao;
final bool comABS;
const FordFocus(this.fabricante, this.modelo, this.anoFabricacao, this.comABS);
}
Quando você deseja que um construtor chame outro construtor internamente, ele é chamado de construtores de redirecionamento.
class Carro {
String fabricante;
String modelo;
String anoFabricacao;
bool comABS;
Carro(this.fabricante, this.modelo, this.anoFabricacao, this.comABS);
Carro.semABS(this.fabricante, this.modelo, this.anoFabricacao): this(fabricante, modelo, anoFabricacao, false);
}
Conclusão
Cada um dos construtores que discutimos tem um propósito e um caso de uso diferentes. Cabe a você determinar e entender quando usar cada um. Espero que este artigo tenha dado a você o conhecimento necessário para fazer isso.