Anunciando o Dart 3.7
É um novo ano, e hora de uma nova versão estável do Dart. Bem-vindo ao Dart 3.7!
O tema desta versão é produtividade do desenvolvedor. Tornamos a linguagem Dart mais consistente ao ajustar a forma como ela trata variáveis curinga. Também há um estilo totalmente novo no formatador do Dart, novos quick fixes e lints no analisador e vários recursos legais novos no pub.dev. Vamos aos detalhes!
Atualização sobre macros
#Recentemente publicamos atualizações no gerenciador de issues, bem como um post no blog, informando que estamos interrompendo o trabalho no nosso recurso experimental de macros. Agradecemos à comunidade por ser tão compreensiva diante desse desfecho infeliz.
Com essa mudança, porém, a equipe recupera parte da capacidade para investir em outros desenvolvimentos valiosos. Já estamos analisando melhorias no desempenho do build_runner, ainda esperamos lançar o recurso de linguagem de augmentations (talvez em uma forma um pouco diferente) e esperamos encontrar formas novas e mais diretas de dar suporte à modelagem de dados e ao serialização e desserialização (de e para JSON, por exemplo).
Recurso de linguagem: variáveis curinga
#
Variáveis locais e parâmetros chamados _ agora são o que as linguagens funcionais chamam de "curingas" (wildcards). Isso significa que o nome é um marcador de posição e não declara nenhuma variável de fato.
Atualmente, em Dart, é comum usar _ como nome de um parâmetro de callback quando o corpo do callback não precisa usar o argumento, assim:
void announceCompletion(Future<void> future) {
future.then((_) { // <--
print('Complete!');
});
}
Mas, se um callback tem vários parâmetros que você não precisa usar, acaba nomeando-os _,
__, ___ etc., porque do contrário os nomes colidem. Agora, no Dart 3.7, parâmetros e variáveis locais chamados
_ não criam uma variável de fato, então não há possibilidade de colisão de nomes. Você pode usar
_ em vários parâmetros, como em:
void announceFailure(Future<void> future) {
future.onError((_, _) { // <--
print('Error!');
});
}
Se você tem código que declara um parâmetro ou variável chamado _ e o usa, esse código não vai mais funcionar no Dart 3.7. Por exemplo:
var [1, 2, 3].map((_) {
return _.toString();
// ^ Error! Reference to unknown variable.
});
Nessa situação, você terá que renomear o parâmetro ou a variável local. Essa mudança de linguagem se aplica apenas a parâmetros e variáveis locais (não a variáveis de nível superior ou membros), então você pode fazer essa renomeação sem quebrar a API pública da sua biblioteca.
As variáveis curinga são um recurso pequeno que torna a linguagem mais consistente. Variáveis chamadas
_ em padrões sempre se comportaram dessa forma:
var [_, _, third, _, _] = [1, 2, 3, 4, 5];
print(third); // Prints "3".
Agora parâmetros e variáveis locais se comportam da mesma forma.
Novo estilo de formatação no formatador do Dart
#
O Dart 3.7 inclui um formatador do Dart (dart format) reescrito, com um novo estilo de formatação. O novo estilo se parece com o que você obtém ao adicionar vírgulas finais nas listas de argumentos, só que agora o formatador adiciona e remove essas vírgulas para você. Por exemplo:
// Old style:
void writeArgumentList(
Token leftBracket, List<AstNode> elements, Token rightBracket) {
writeList(
leftBracket: leftBracket,
elements,
rightBracket: rightBracket,
allowBlockArgument: true);
}
// New style:
void writeArgumentList(
Token leftBracket,
List<AstNode> elements,
Token rightBracket,
) {
writeList(
leftBracket: leftBracket,
elements,
rightBracket: rightBracket,
allowBlockArgument: true,
);
}
Esta é uma grande mudança tanto na ferramenta, quanto na saída que ela produz e na forma como se comporta. Para tornar a transição o mais suave possível, o estilo de formatação que você obtém depende da versão da linguagem do código que você está formatando. Se a versão da linguagem for 3.6 ou anterior, o código é formatado com o estilo antigo. Se for 3.7 ou posterior, ele recebe o novo estilo.
Quando você atualizar seu pacote para usar o Dart 3.7 alterando a restrição de SDK no pubspec do pacote (e executando
dart pub get!), você estará optando pelo novo estilo de formatação.
Para determinar a versão da linguagem de cada arquivo que formata, o dart format procura um
package_config.json. Isso significa que você precisa executar dart pub get antes de formatar o código do seu pacote. Se você tem verificações de formatação no seu servidor de integração contínua, certifique-se de que ele também execute
dart pub get.
Não pretendemos oferecer suporte aos dois estilos indefinidamente. Em algum momento no futuro, quando a maior parte do ecossistema estiver na 3.7 ou posterior, o suporte ao estilo antigo será removido.
O novo estilo inclui alguns recursos pedidos há muito tempo:
-
Configuração de largura de página em todo o projeto. Agora você pode configurar a largura de página de formatação preferida para todo o projeto no seu arquivo
analysis_options.yaml, assim:
formatter:
page_width: 123
- Excluir uma região de código da formatação. Você pode usar um par de comentários marcadores especiais para excluir uma região de código da formatação automática:
main() {
// dart format off
no + formatting + here;
// dart format on
}
Há também uma mudança incompatível. O formatador não oferece mais suporte a dart format --fix. Em vez disso, use
dart fix para aplicar todas as correções que o dart format fazia e mais algumas.
Você pode encontrar mais detalhes no CHANGELOG e na FAQ.
Quick fixes atualizados e novos lints no analisador do Dart
#
Estamos sempre melhorando ativamente o Dart para aumentar a produtividade do desenvolvedor, e isso significa melhorar o analisador com novos lints, quick fixes e assists no Dart 3.7. Uma adição notável é o lint
unnecessary_underscores, que dá suporte ao novo recurso de variáveis curinga.
Entre a ampla gama de novos quick fixes e assists que o Dart 3.7 inclui estão correções para problemas comuns, como palavras-chave
await ausentes, prefixos de import incorretos e violações de regras de lint como cascade_invocations. Há também assists práticos para refatorar código, como converter blocos
else em else if e envolver widgets do Flutter com Expanded ou
Flexible.
Você pode encontrar mais detalhes sobre tudo isso, e muito mais, na lista completa de mudanças do analisador.
Avançando na plataforma web do Dart
#
Há um ano, introduzimos novas bibliotecas e pacotes
para interoperar com JavaScript e as APIs do navegador a partir do Dart. Daqui em diante, a principal biblioteca de JavaScript é a
dart:js_interop. Para as APIs do navegador, use o
package:web.
Como parte do nosso esforço contínuo para levar os ecossistemas do Dart e do Flutter a APIs compatíveis com WebAssembly, estamos descontinuando as APIs legadas associadas no SDK do Dart. Sete bibliotecas do SDK do Dart estão descontinuadas na versão 3.7:
dart:htmldart:indexed_dbdart:jsdart:js_utildart:web_audiodart:web_gl
Planejamos remover essas bibliotecas no final de 2025. Você pode conhecer os substitutos delas na página de interoperabilidade com JavaScript.
Novos recursos de produtividade no site de pacotes do pub.dev
#Em dezembro lançamos as contagens de download de pacotes no pub.dev. Elas mostram os downloads mensais junto com um pequeno gráfico com os downloads semanais ao longo do tempo.
Hoje, estendemos isso com suporte para visualizar as contagens de download por versão do pacote. Agora é possível ter uma indicação de quantos consumidores de um pacote já migraram para a versão mais recente (ou apenas para a versão principal mais recente). Esses dados foram pensados para ajudar os autores de pacotes a avaliar o valor de portar correções para versões principais mais antigas de um pacote.
Modo escuro para o pub.dev
O modo escuro para o pub.dev é há muito tempo um pedido popular, e a partir de hoje já é possível alternar o pub.dev para o modo escuro. Essa opção afeta tanto as páginas dos pacotes quanto a documentação da API dos pacotes hospedada no pub.dev.
Tópicos para o pub.dev
No ano passado, lançamos o suporte a tópicos no pub.dev. Você pode
adicionar tópicos ao seu pubspec.yaml
e, se encontrar tópicos relacionados que deveriam ser unificados, pode propor a canonicalização
com um pull request.
Quem navega pelo pub.dev pode clicar nos tópicos para explorar pacotes relacionados. Antes, já tínhamos introduzido a possibilidade de pesquisar tópicos no pub.dev usando palavras-chave de pesquisa (como "topic:widget"), mas nem sempre era fácil descobrir essas palavras-chave. Então, lançamos um autocompletar, no estilo de IDE, para as palavras-chave de pesquisa do pub.dev. Você pode acioná-lo pressionando ctrl+espaço ou ele é disparado automaticamente quando você digita um prefixo correspondente, como "topic:" ou "license:".
Encerramento
#É isso por hoje para o Dart 3.7. Como sempre, conte para a gente o que você achou! E não deixe de conferir o post do blog sobre o lançamento do Flutter 3.29 de hoje também. Até a próxima!