Novidades no Dart 3.3: Extension Types, interop com JavaScript e mais

O Dart 3.3 chegou, e é uma virada de jogo para performance e desenvolvimento multiplataforma! Prepare-se para turbinar seus apps com…

Dart 3.3 release banner with the Dart logo and a bullseye icon.

O Dart 3.3 chegou, e é uma virada de jogo para performance e desenvolvimento multiplataforma! Prepare-se para turbinar seus apps com Extension Types, que revolucionam a otimização de performance e a forma como você interage com código nativo. Além disso, nosso modelo de interop com JavaScript reformulado traz segurança de tipos robusta e uma forma amigável para o desenvolvedor acessar o poder da plataforma web. Tudo isso abre caminho para o suporte ao WebAssembly. Ah, e o Google AI nos seus apps Dart? Claro que sim! Está tudo aqui no Dart 3.3. Vamos mergulhar!

Apresentando os Extension Types

#

Extension types introduzem wrappers de custo zero para tipos. Use-os para otimizar código sensível à performance, especialmente ao interoperar com plataformas hospedeiras. Extension types oferecem a conveniência de tipos customizados com membros específicos, eliminando o custo típico de alocação de wrappers.

dart
extension type Wrapper(int i) {
  void showValue() {
    print('my value is $i');
  }
}
​
void main() {
  final wrapper = Wrapper(42);
  wrapper.showValue(); // Prints 'my value is 42'
}

O exemplo anterior define Wrapper como um extension type, mas o usa como um tipo Dart trivial. Você pode instanciá-lo e invocar funções. A diferença fundamental é que o Dart o compila como um int Dart normal. Extension types permitem a conveniência de criar um tipo com membros próprios sem o custo de indireção de alocar um tipo wrapper típico. Assim, embora o recurso de extension members (disponível no Dart desde a 2.7) permita adicionar funções e propriedades a um tipo existente, o recurso de extension type faz o mesmo e também permite definir uma nova API que oculta a representação subjacente.

Isso é especialmente útil para interoperabilidade com plataformas hospedeiras. Tipos nativos podem ser usados diretamente, sem o custo de criar wrappers e a indireção associada, mantendo ainda uma API Dart limpa e pronta para produção. Saiba mais na nova documentação sobre extension types.

Evoluindo o interop com JavaScript

#

O Dart 3.3 introduz um novo modelo para interoperar com bibliotecas JavaScript e com a web. Ele começa com um novo conjunto de APIs para interagir com JavaScript: a biblioteca dart:js_interop. Agora, desenvolvedores Dart têm acesso a uma API tipada para interagir com JavaScript. Essa API define claramente a fronteira entre as duas linguagens, com enforcement estático. Isso elimina toda uma classe de problemas antes da compilação. Além das novas APIs para acessar código JavaScript, o Dart agora inclui um novo modelo para representar tipos JavaScript em Dart usando extension types.

dart
import 'dart:js_interop';
​
/// Represents the `console` browser API.
extension type MyConsole(JSObject _) implements JSObject {
  external void log(JSAny? value);
  external void debug(JSAny? value);
  external void info(JSAny? value);
  external void warn(JSAny? value);
}

A sintaxe, baseada em extension types, permite mais expressividade e solidez do que os extension members. Isso simplifica o uso de APIs JavaScript a partir do Dart. Saiba mais na nova documentação sobre JS interop.

Melhorando as bibliotecas de browser

#

Desde a versão 1.0, o SDK do Dart inclui um conjunto abrangente de bibliotecas para browser. Elas incluem a biblioteca principal dart:html, junto com bibliotecas para SVG, WebGL e outras.

O modelo de interop com JavaScript aprimorado nos deu a chance de repensar essas bibliotecas. Daqui para frente, nosso suporte a bibliotecas de browser vai se concentrar no package:web. Isso simplifica o versionamento, acelera as atualizações e se alinha aos recursos do MDN.

Essa cadeia de melhorias leva à próxima grande novidade: compilar Dart para WebAssembly.

Comece hoje a preparar o futuro com WebAssembly

#

Com o Dart 3.3, autores de pacotes e aplicativos podem preparar o terreno para aplicações web compiladas para WebAssembly. Embora o suporte a WebAssembly no Flutter Web ainda seja experimental, a equipe está trabalhando duro para estabilizar a implementação. Para rodar aplicativos Flutter na web usando WebAssembly, você precisa migrar todo o código — do aplicativo e de todas as dependências — para usar o novo mecanismo de JavaScript Interop e o package:web. As bibliotecas legadas de JavaScript e de browser continuam inalteradas e suportadas para compilar para código JavaScript. No entanto, compilar para WebAssembly exige uma migração.

Criamos um guia de migração para ajudar os autores a começar a incluir Wasm. Esperamos que os pacotes mais populares já ofereçam suporte a Wasm até o momento em que o incluirmos em uma versão estável.

Mais uma coisa: apresentando o Google AI Dart SDK

#

O Google lançou o Google AI Dart SDK em beta. Você pode criar recursos de IA generativa no seu app Dart ou Flutter. Esses apps usam o Gemini, a mais recente família de modelos de IA do Google. Dê uma olhada no package:google_generative_ai. Aprenda a criar com o Google AI Dart SDK neste post do blog ou vá direto para o quickstart.

Build with Gemini wordmark on a black background.

Mais do Dart