Start Debugging

Dot shorthands no Dart 3.12: elimine o nome do tipo no seu código Flutter

Os dot shorthands ficaram estáveis no Dart 3.12.2. Escreva .center ou .new e deixe o compilador inferir o tipo a partir do contexto. Veja como eles funcionam com enums, membros estáticos e construtores.

Se a sua árvore de widgets do Flutter é uma parede de MainAxisAlignment.center, CrossAxisAlignment.start e EdgeInsets.all, o Dart acabou de te dar uma forma de apagar boa parte dessa repetição. Os dot shorthands, o recurso que deixa você escrever .center e o compilador descobrir o tipo, ficaram estáveis no Dart 3.12.2. O Flutter 3.44 já traz o Dart 3.12, então, se você está no canal stable atual, pode usar isso hoje.

O que o ponto inicial realmente faz

Um dot shorthand é uma expressão que começa com um . isolado. Quando o contexto ao redor torna o tipo alvo inequívoco, o Dart resolve o membro em relação a esse tipo em vez de obrigar você a escrevê-lo por completo. O caso clássico é um enum em uma atribuição:

Status currentStatus = .running; // Instead of Status.running

A variável é declarada como Status, então .running só pode significar Status.running. A mesma inferência entra em ação dentro de um switch, onde o valor comparado já fixa o tipo:

return switch (level) {
  .debug => 'gray',
  .info => 'blue',
  .warning => 'orange',
  .error => 'red',
};

Não é só para enums

O mecanismo é geral: qualquer membro estático acessível pelo tipo de contexto é válido. Isso inclui métodos estáticos, getters estáticos, construtores nomeados e construtores de fábrica.

int port = .parse('8080');      // int.parse('8080')
BigInt zero = .zero;            // BigInt.zero
Point origin = .origin();       // Point.origin() named constructor
Point p = .fromList([1.0, 2.0]); // Point.fromList(...) factory

O construtor sem nome ganha um nome para esse propósito: .new. Esse único detalhe é o que faz o recurso valer a pena em código Flutter real, onde você atribui constantemente objetos recém-construídos a campos tipados:

final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();

A única regra que faz as pessoas tropeçarem

A igualdade tem um caso especial. Quando você usa um shorthand no lado direito de == ou !=, o Dart toma o tipo estático do operando esquerdo como contexto:

if (myColor == .green) {
  print('The color is green.');
}

Aqui myColor é tipado como Color, então .green se resolve para Color.green. O shorthand precisa ficar no lado direito. Inverta para .green == myColor e não há tipo de operando esquerdo para inferir, então não vai compilar.

Como ligar isso

Os dot shorthands exigem uma versão de linguagem de pelo menos 3.10, e o recurso chegou ao stable no Dart 3.12.2. Se você já está no Flutter 3.44, tem ele. Suba a restrição do SDK no pubspec.yaml para ^3.12.0 e o analisador para de sinalizar o ponto inicial. Não há custo em runtime nem mudança no código gerado: isso é pura sintaxe que se resolve em tempo de compilação para o membro totalmente qualificado que você teria escrito de qualquer forma.

O ganho não é código mais curto por si só. É que o tipo aparece uma única vez, na declaração, em vez de ser repetido em cada valor. Veja a página de linguagem sobre dot shorthands para todas as regras de resolução.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar