Comunidade

O que há de novo no Flutter 3.47 | O Blog do Flutter

A versão 3.47 do Flutter traz o lançamento em versão 1.0 dos pacotes standalone material_ui e cupertino_ui, permitindo uma maior flexibilidade na atualização de design sem necessidade de upgrades no SDK completo. Além disso, a nova versão melhora desempenho e ferramentas, incluindo a implementação padrão do Impeller para desktops e preparação das linhas de montagem para os próximos lançamentos da Apple.

Compartilhar
What’s new in Flutter 3.47 | The Flutter Blog
O que há de novo no Flutter 3.47
O que há de novo no Flutter 3.47

O Flutter 3.47 está aqui, e com ele trazemos algumas atualizações muito interessantes.

Agora, damos as boas-vindas à versão 1.0 dos pacotes material_ui e cupertino_ui. Esta é uma importante etapa que desacopla os sistemas de design do SDK principal.

Também estamos melhorando o desempenho e as ferramentas em geral. Esta versão traz Impeller como padrão para desktop, prepara nossos pipelines para iOS, macOS e Xcode 27, e promove Flutter Widget Previews à estabilidade.

Então, execute flutter upgrade no terminal para começar ou continue lendo para saber mais sobre as principais mudanças nesta versão.


Escolha sua própria aventura de interface do usuário

A primeira etapa em direção a um Flutter desacoplado está aqui: Material e Cupertino agora estão disponíveis como pacotes independentes!

Uma das maiores forças do Flutter é sua capacidade de renderizar widgets de Material e Cupertino perfeitos. No entanto, porque essas bibliotecas de design eram historicamente embutidas diretamente no SDK principal, isso retardava seu desenvolvimento e dificultava a contribuição ou manutenção.

Embora o SDK principal ainda inclua essas bibliotecas nesta versão, você pode optar pelo pacote independente material_ui e cupertino_ui, que oficialmente atingiram a versão 1.0 no pub.dev.

Desacoplamento de roadmaps de design (Opt-in)

Ao optar pelo sistema de design desacoplado, você ganha controle sobre seu roadmap de design. Como material_ui e cupertino_ui agora vivem no pub.dev, eles podem enviar correções de bugs e novos componentes em suas próprias agendas semanais, independentemente das versões trimestrais do SDK Flutter.

O desacoplamento dos sistemas de design nos dá os seguintes benefícios:

  • Você pode usar as últimas estilizações de Cupertino e Material sem ser forçado a atualizar toda a sua versão do SDK Flutter.
  • Podemos receber contribuições e atualizações mais rapidamente e com maior frequência.
  • Nosso trabalho para um catálogo principal de widgets neutros em termos de estilo torna mais fácil construir sistemas de design personalizados no futuro.

Como migrar

Para migrar seu projeto para os novos pacotes independentes, execute o seguinte comando:

bash
dart fix --apply --code=migrate_design_widgets

Esta ferramenta atualiza automaticamente suas importações de package:flutter/material.dart e package:flutter/cupertino.dart para os novos pacotes independentes.

Aviso: Se a ferramenta de migração encontrar problemas ao atualizar seu pubspec.yaml, você pode resolver isso manualmente executando flutter pub add material_ui (e cupertino_ui se você usá-lo), então execute dart fix --apply novamente.

A biblioteca de design original dentro do SDK principal está programada para ser oficialmente descontinuada na próxima versão estável do outono, em novembro. Se você estiver migrando um pacote no ecossistema, trate essa mudança para os pacotes independentes como uma nova versão major.

Conectando a lacuna da migração

Para facilitar a conexão dessa lacuna à medida que o ecossistema migra para as novas bibliotecas de design independentes, material_ui e cupertino_ui são fornecidos com utilitários de migração. O MaterialUiCompatibilityBridge permite que seu aplicativo se mude para os pacotes independentes imediatamente, mesmo que algumas das suas dependências de pacote ainda estejam usando importações legadas do SDK principal.

Você pode envolver o seu app no bridge de compatibilidade:

dart
import 'package:material_ui/material_ui.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)),
      ),
      builder: (BuildContext context, Widget? child) {
        return MaterialUiCompatibilityBridge(child: child!);
      },
      home: const HomeScreen(),
    );
  }
}

Localizações desacopladas

Como parte dessa transição, flutter_localizations também foi desembrulhado. Delegados de localização e strings traduzidas para widgets Material e Cupertino agora residem dentro de package:material_ui e package:cupertino_ui, respectivamente.

Antes:

dart
import'package:material_ui/material_ui.dart';

// ...
localizationsDelegates:GlobalMaterialLocalizations.delegates,

Definir localizationsDelegates como GlobalMaterialLocalizations.delegates agora inclui os delegados Cupertino e Widgets também, simplificando sua configuração.

Diagrama arquitetural mostrando a desvinculação de pacotes
Estrutura de desacoplamento da localização

Aberto para contribuição

Ao congelar as contribuições às bibliotecas Material e Cupertino em abril, conseguimos garantir uma migração suave. As bibliotecas que estão esperando por você em material_ui e cupertino_ui são as mesmas bibliotecas que você já está usando.

Agora que estamos prontos para levantar o congelamento, espere por mais correções e recursos sendo lançados regularmente nos novos pacotes, com releases atualmente planejadas para chegar semanalmente. Estamos também animados em oficialmente abrir esses pacotes para contribuições da comunidade.


Preparando-se para a próxima onda de atualizações da Apple

Com o Xcode 27, iOS 27 e macOS 27 chegando neste outono, focamos fortemente em garantir que o Flutter esteja pronto para as próximas atualizações. Para garantir que seus usuários não tenham surpresas no dia um, recomendamos testar seus aplicativos contra os betas da Apple agora.

Além disso, para suportar o Xcode 27, as versões mínimas de OS foram atualizadas:

PlataformaVersão mínima anteriorNova versão mínima (Flutter 3.47+)
iOS1315
macOS10.1512

Mandato de ciclo de vida UIScene

O SDK iOS 27 agora exige o ciclo de vida UIScene para todos os aplicativos baseados em UIKit. Aplicativos construídos com Xcode 27 que não adotam UIScene falharão ao iniciar no início.

Para a maioria dos aplicativos, o Flutter CLI lida com essa migração automaticamente durante a construção. No entanto, uma migração manual é necessária se você tiver código nativo personalizado em seu AppDelegate ou usar plugins que ainda dependem do ciclo de vida da aplicação legado. Nesses casos, você deve migrar manualmente seguindo o Guia de Adoção UIScene/Delegate.

Encerrando suporte a Macs Intel

Em alinhamento com a transição da Apple para processadores baseados em silício, o Flutter está reduzindo o suporte para Macs Intel. Desabilitamos testes automatizados em hardware Intel e o Flutter CLI agora imprime avisos durante a construção em hosts Intel ou ao direcionar arquiteturas dual.

Você pode optar por construir aplicativos macOS ARM64-only imediatamente executando flutter config --enable-macos-arm64-only.

Progresso com Swift Package Manager

A comunidade fez progressos incríveis na transição para o Swift Package Manager, com 92 dos 100 principais plugins iOS agora migrados. Se você desativou anteriormente o Swift Package Manager, pode tentar novamente executando flutter config --enable-swift-package-manager.

Como CocoaPods está em modo de manutenção, plugins que não migram para SwiftPM eventualmente deixarão de funcionar. Plugins sem migrar também recebem pontuações mais baixas no pub.dev. Se você mantém um plugin, consulte o Guia de Migração e leia nosso post anterior do blog para mais detalhes.

Nesta versão, também incluímos otimizações de tempo de construção, graças ao contribuidor da comunidade @lukemmtt, que melhorou as pipelines de construção filtrando esquemas SwiftPM desnecessários no início do processo de construção.


Configurando Wasm como padrão

Estamos trabalhando ativamente para habilitar WebAssembly (Wasm) por padrão em aplicações Flutter web, trazendo desempenho nativo ao navegador. Se você ainda não testou seus aplicativos web com Wasm, pode optar por isso hoje passando a flag --wasm no comando de construção de release:

bash
flutter build web --release --wasm

À medida que você se prepara para essa transição, lembre-se de que Wasm requer a migração do seu códigobase para o novo pacote JS interop (package:web), pois a biblioteca legada dart:html não é suportada. Atualizar as dependências do pacote do seu projeto geralmente resolve automaticamente esses problemas de interoperação legados.

Para ajudar a escalar aplicativos web maiores, esta versão também introduz um suporte experimental para carregamento diferido em Wasm. Disponível sob uma flag no canal principal, isso permite que você divida seu aplicativo Wasm em módulos menores e carregados com preguiça, otimizando o tempo de carga inicial:

bash
flutter build web --release --wasm --enable-wasm-deferred-loading

Gráficos modernos chegam no desktop com Impeller

Nós estamos comprometidos em tornar as plataformas de desktop alvos de primeira classe para gráficos de alto desempenho. Na versão Flutter 3.47, o Impeller se torna o renderizador padrão para macOS, Windows e Linux.

Se você é novo no Impeller, ele é a próxima geração do motor de renderização do Flutter, construído do zero para substituir o Skia. Ao alvo de APIs de hardware modernas (como Metal em macOS e Vulkan em Windows e Linux), o Impeller compila um conjunto fixo de shaders durante a construção ao invés de compilá-los dinamicamente no tempo de execução. Isso elimina o breve travamento, chamado de jank de compilação de shader, que ocorre na primeira vez que uma animação é reproduzida, entregando transições consistentemente suaves desde o primeiro frame. Saiba mais na documentação do motor de renderização Impeller.

Se você precisar optar temporariamente fora do Impeller, siga estas etapas:

  • macOS: Defina FLTEnableImpeller como false em Info.plist.
  • Windows: Adicione project.set_impeller_switch(flutter::ImpellerSwitch::Disabled) em main.cpp.
  • Linux: Chame fl_dart_project_set_enable_impeller(project, FALSE) em my_application.cc.

Opções de fallback serão removidas em uma futura versão, então reporte bugs se você precisar reverter para o uso do Skia. Além disso, a Wide Gamut Color está agora ativada por padrão no macOS, entregando cores ricas, vibrantes e precisas na renderização em hardware compatível.

Progresso experimental de multi-janela

Em parceria com a Canonical, e graças aos mantenedores @robert-ancell e @mattkae, estamos expandindo nossas APIs de janela do desktop experimentais. Linux e Windows agora suportam janelas popup, permitindo que você construa menus contextuais nativos e paletas de utilidade.

Janelas popup no Win32
Janelas popup no Win32

Agora você também pode consultar windowHandle em controladores específicos da plataforma para obter um ponteiro direto para a janela nativa subjacente (HWND, NSWindow ou GtkWindow). Isso permite acesso avançado a recursos nativos, como painéis anexáveis no Windows, como demonstra este exemplo de painéis anexáveis contribuído por @orestesgaolin:

Demo Painéis Anexáveis
Demo Painéis Anexáveis

Também resolvemos vários bugs de foco e realização de janela. No Windows, ativar uma janela não puxa mais janelas de fundo para a frente ou rouba o foco ao retomar o aplicativo, graças ao contribuidor @9AZX.

Correção de foco e realização da janela em Windows
Correção de foco e realização da janela

Em Linux, a criação de múltiplas janelas agora realiza explicitamente as janelas antes de receberem seu primeiro quadro do compositor, corrigindo avisos de renderização antecipada e afirmações do compositor.

Também adicionamos uma nova API tamanho-conteúdo que permite criar janelas regulares e diálogos automaticamente dimensionadas para se ajustar ao conteúdo delas.

Sabores para desktop

Windows e Linux agora suportam sabores do Flutter.

Por exemplo, seu arquivo pubspec.yaml pode usar diferentes ativos em diferentes sabores:

yaml
flutter:
assets:
-path:assets/flavor_a/images
flavors:
-flavor_a
-path:assets/flavor_b/images
flavors:
-flavor_c

Use a opção --flavor para especificar seu sabor. Por exemplo:

  • flutter build windows --flavor flavor_a
  • flutter build linux --flavor flavor_a

Muito obrigado ao @AngeloAvv pelas contribuições fantásticas!

Texto mais nítido para desktop

Telas de desktop geralmente têm densidades de pixels menores do que displays móveis, mas possuem mais poder computacional gráfico. Para entregar texto mais nítido e curvas vetoriais mais limpas em desktops, o motor Flutter usando Impeller agora utiliza a renderização por Função de Distância Assinada (SDF) no macOS, Linux e Windows.


Pré-visualizações estáveis e atualizações ao GenUI

O Flutter Widget Preview agora está em versão estável, permitindo que você renderize, inspecione e itere sobre componentes de UI individuais sem precisar construir ou iniciar seu aplicativo inteiro.

Com esta versão estável, você pode esperar:

  • Tempo de inicialização mais rápido graças ao cache local do projeto em uma pasta .widget_preview/, eliminando a sobrecarga de configuração repetida.
  • Testes mais flexíveis com um API abstrata PreviewThemeData que suporta camadas sequenciais de tema para testes complexos em matriz.
  • Sincronização automática de ativos web ao pré-visualizar widgets web, copiando os ativos da pasta web/ do seu projeto hospedeiro diretamente e aplicando qualquer tematização personalizada ou customizando o arquivo index.html automaticamente quando usar Flutter web.

Avanços contínuos no GenUI

O ecossistema do Flutter continua evoluindo para atender às necessidades dos desenvolvedores usando o GenUI para criar novas experiências agênticas para seus usuários. A versão 0.10.0 do pacote genui foi recentemente lançada, trazendo vários reparos e novas funcionalidades, entre elas:


Refinando a experiência do plataforma

Esta seção destaca melhorias específicas contribuídas pela comunidade e pelo time Flutter para polir a experiência de desenvolvedor e usuário em todas as plataformas.

Android

No Android, resolvemos um problema com o teclado virtual onde as teclas modificadoras (como Shift) poderiam ficar presas durante eventos. Agora, a resposta de tecla ignora a síntese de teclas físicas para entradas do teclado virtual, mantendo interações limpas.

Matriz de dependência do Android

Para garantir builds estáveis, o Flutter 3.47 é verificado contra as seguintes versões das dependências do Android:

  • Java: 17 (versão mínima necessária)
  • Kotlin Gradle Plugin (KGP): 2.4.0
  • Android Gradle Plugin (AGP): 9.1.0 (mais recente compatível com KGP 2.4.0)
  • Gradle: 9.3.1 (versão mínima necessária para AGP 9.1.0)

Para garantir que sua aplicação seja construída com sucesso em futuras versões, recomendamos usar as variáveis de nível API padrão fornecidas pelo SDK Flutter nos seus arquivos de build. Nesta versão, eles estão configurados com os seguintes valores padrão:

  • flutter.compileSdkVersion (API 36)
  • flutter.targetSdkVersion (API 36)
  • flutter.minSdkVersion (API 24)

iOS e macOS

Para desenvolvedores iOS, a assinatura de código agora é mais transparente. Obrigado ao membro da comunidade @alex-medinsh, o CLI exibe tanto o ID do Time quanto o Nome do Time quando selecionar um certificado.

Além disso, o membro da comunidade @mozammal-hossain melhorou a resolução de problemas fornecendo mensagens de erro mais claras para perfis de provisionamento quando a assinatura falha.

Desktop

As plataformas desktop também receberam refinamentos específicos. A posição do cursor foi resolvida para a composição de texto coreana em Windows (obrigado ao @CHOIgoung), e os plugins do Windows podem agora mover tarefas caras fora da thread da plataforma usando FlutterEngine::PostPlatformThreadTask. No Linux, o membro da comunidade @CodeDoctorDE adicionou relatório de rotação e pressão do stylus.

Gráficos e motor

No motor, os fragmentos de shader que alvo a OpenGLES não precisam mais de condição para inverter coordenadas ao ler texturas. Isso agora é tratado no shader do vértice. Consulte a página de alterações de ruptura render-to-texture da OpenGLES para mais detalhes.

Polimento do framework

Finalmente, o próprio framework é mais suave, com melhorias divididas em componentes-chave:

Acessibilidade e semântica: As configurações de contraste alto e inversão de cores do Android agora são detectadas automaticamente, graças ao @xxxOVALxxx (MediaQueryData.highContrast e MediaQueryData.invertColors). Os spans de texto aninhados dentro do Text.rich agora correspondem à sequência de layout na árvore semântica, e bloqueio de foco teclado é adicionado para o BlockSemantics.

Configurações de acessibilidade do Android
Configurações de acessibilidade do Android

Texto e seleção: As barras de seleção no texto em dispositivos móveis agora permanecem estáveis durante rolagens menores, e atalhos de teclado podem agora fechar menus abertos de seleção. No Android, as barras de seleção não obscurecem mais o menu de contexto quando posicionadas perto do topo da tela, graças a @JhonaCodes.

ANTESDEPOIS
Barras de seleção sobrepostas ao menu Barras de seleção corretamente posicionadas

Também corrigimos um crash no SelectableRegion quando a seleção começou em um contêiner rolagem vazio, e resolvemos artefatos visuais de destaque em texto selecionável desvanecido, graças a @ikramhasan.

ANTESDEPOIS
Antes do destaque Depois do destaque

Gestos e rolagem: Melhorias na propagação de gestos para visualizações nativas do iOS incorporadas via visualizações de plataforma. O EdgeDraggingAutoScroller agora respeita o ScrollPhysics da visualização de rolagem ativa, prevenindo a rolagem automática em listas travadas.

Demo EdgeDraggingAutoScroller
Demo EdgeDraggingAutoScroller

Aprimoramentos do Widget principal: Preservar as cores originais dentro de ImageIcon com useOriginalColors: true, especificar o comportamento de recorte em AnimatedCrossFade, e rastrear erros diretos da stream de imagens com ImageStreamListener.


Pronto para atualizar

As peças estão prontas, e as fundações também. O que resta é trazer essas atualizações para sua máquina local:

bash
flutter upgrade

Enquanto seu SDK atualiza em segundo plano, temos um trabalho (do tipo divertido) para você:

Estamos ansiosos para ver o que vocês todos irão construir com esta nova e melhorada versão do Flutter!

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa