Dart 2.18: Objective-C e interoperabilidade Swift
Interoperabilidade aprimorada, rede específica de plataforma, inferência de tipo aprimorada e uma atualização importante em nosso roteiro de linguagem de segurança nula
O Dart 2.18 está disponível hoje. Esta versão apresenta uma prévia da interoperabilidade Objective-C e Swift e um novo pacote de rede iOS/macOS construído sobre esta interoperabilidade. Ele também contém inferência de tipo aprimorada para funções genéricas, melhorias de desempenho para código assíncrono, novos recursos pub.dev e limpeza de nossas ferramentas e bibliotecas principais.
Por fim, temos os números mais recentes do status de migração de segurança nula e uma atualização importante do roteiro em nosso caminho em direção a um Dart totalmente seguro e nulo. Por favor, leia até o fim!
Apresentando o Dart à interoperabilidade de Objective-C e Swift
Visualizamos a interface de função externa (FFI) do Dart para chamar APIs C nativas em 2020 e a lançamos no Dart 2.12 em março de 2021. Desde esse lançamento, uma grande seleção de pacotes aproveitou esse recurso para integrar-se às APIs C nativas existentes. Alguns exemplos incluem file_picker, printing, win32, objectbox, realm, isar, tflite_fluttere dbus.
A equipe do Dart deseja que o Dart ofereça suporte à interoperabilidade com todos os idiomas principais nas plataformas em que o Dart é executado. O Dart 2.18 atinge o próximo marco em direção a esse objetivo. Seu código Dart pode chamar o código Objective-C e Swift, como normalmente usado para APIs nas plataformas macOS e iOS. O Dart oferece suporte a esse mecanismo de interoperabilidade em qualquer aplicativo, desde o aplicativo CLI até o código de back-end para uma interface do usuário do Flutter.
Esse novo mecanismo utiliza o fato de que o código Objective-C e Swift pode ser exposto como código C com base em ligações de API. A ferramenta de geração de wrapper da Dart API, ffigen, pode criar essas ligações a partir dos cabeçalhos da API. Vamos dar uma olhada em um exemplo.
Exemplo de fuso horário usando Objective-C
O macOS possui uma API para consultar as informações de fuso horário expostas na NSTimeZoneclasse . Você pode consultar esta API para o fuso horário e o deslocamento de fuso horário UTC que o usuário configurou para seu dispositivo.
O exemplo de aplicativo Objective-C a seguir usa essa API de fuso horário para obter o fuso horário do sistema e o deslocamento GMT:
O app imports Foundation.h, que contém os cabeçalhos da API para a biblioteca Apple Foundation. Em seguida, dentro do mainmétodo, ele chama o systemTimeZonemétodo da NSTimeZoneclasse. Este método retorna uma NSTimeZoneinstância com o fuso horário selecionado no dispositivo. Por fim, o aplicativo gera duas linhas no console contendo o nome do fuso horário e o deslocamento UTC em horas.
Se você executar este aplicativo, ele deve retornar algo semelhante ao seguinte, dependendo da sua localização:
Timezone name: Europe/Copenhagen
Timezone offset GMT: 2 hours
Vamos replicar esse resultado com o Dart usando a nova interoperabilidade Objective-C.
Primeiro, crie um novo aplicativo Dart CLI:
$ dart create timezones
Isso seleciona as ligações Objective-C para os cabeçalhos NSTimeZone.he inclui apenas as APIs na NSTimeZoneinterface. Para gerar os wrappers, execute ffigen:
$ dart run ffigen
É isso! Este novo suporte está disponível em um estado experimental a partir do Dart 2.18 de hoje. Isso aumenta o suporte de interoperabilidade geral do Dart para chamar APIs macOS e iOS diretamente. Isso, por sua vez, complementa os plug-ins do Flutter, com novo suporte que funciona em qualquer aplicativo Dart e permite chamar APIs do macOS e iOS diretamente do código Dart.
Agradecemos seus comentários. Conte-nos o que funcionou, o que pode ser alterado ou quais problemas você teve comentando no problema de feedback no GitHub. Para saber mais sobre essa interoperabilidade, consulte o guia de interoperabilidade Objective-C e Swift .
Bibliotecas http específicas da plataforma
O Dart inclui uma biblioteca geral multiplataforma http. Essa biblioteca permite que você escreva código sem se preocupar com especificações da plataforma. Ocasionalmente, você pode querer escrever um código específico para as APIs de rede de uma determinada plataforma de host.
Por exemplo, a biblioteca de rede da Apple NSURLSessionpermite especificar redes somente WiFi ou que requer uma VPN. Para oferecer suporte a esses casos de uso, criamos um novo pacote de rede destinado às plataformas macOS e iOS, cupertino_http. Isso se baseia na nova interoperabilidade Objective-C mencionada na seção anterior. Ele usa um grande conjunto de wrappers de API gerados pelas APIs de rede da Apple no Foundation.
Exemplo de biblioteca http de Cupertino
O exemplo a seguir define o cliente http de um aplicativo Flutter para usar a cupertino_httpbiblioteca no macOS e iOS e a biblioteca http normal do Dart em dart:iooutras plataformas:
Após essa configuração inicial, o aplicativo faz todas as chamadas de rede subsequentes no cliente específico. Por exemplo, uma get()solicitação http agora se parece com isso:
Quando você não pode usar a interface de cliente comum, pode chamar as APIs de rede da Apple diretamente usando a cupertino_httpbiblioteca:
Rede específica da plataforma em aplicativos multiplataforma
Ao projetarmos esse recurso, o objetivo permaneceu para manter os aplicativos o mais multiplataforma possível. Para atingir esse objetivo, mantivemos nossa API multiplataforma geral httpdefinida para operações http básicas e permitimos a configuração por plataforma de qual biblioteca de rede usar. Você pode minimizar a quantidade de código específico da plataforma que precisa escrever usando a package:httpAPI do cliente . Essa API pode ser configurada por plataforma, mas usada de maneira independente da plataforma.
O Dart 2.18 oferece suporte experimental de duas bibliotecas http específicas da plataforma que suportam a package:http API do cliente :
cupertino_httpbaseado emNSURLSessionpara macOS/iOS.cronet_httpbaseado em Cronet , a biblioteca de rede popular no Android.
Inferência de tipo aprimorada
Dart usa muitas funções genéricas. Considere o foldmétodo, que reduz uma coleção de elementos a um único valor. O exemplo a seguir calcula a soma de uma lista de inteiros:
List<int> numbers = [1, 2, 3];
final sum = numbers.fold(0, (x, y) => x + y);
print(‘The sum of $numbers is $sum’);
line 2 • The operator ‘+’ can’t be unconditionally invoked because the receiver can be ‘null’.
final sum = numbers.fold(0, (int x, int y) => x + y);
Melhorias no desempenho assíncrono
Esta versão do Dart melhora a forma como a VM Dart aplica o asyncmétodo e as funções async*/ sync*gerador. Isso reduz o tamanho do código. Em dois grandes aplicativos internos do Google, vimos uma redução do tamanho do instantâneo AOT em cerca de 10%. Também vimos um aumento de desempenho em nossos microbenchmarks.
Essas mudanças incluem pequenas mudanças adicionais de comportamento; para saber mais, consulte o changelog .
melhorias no pub.dev
Em conjunto com a versão 2.18, fizemos duas alterações no pub.devrepositório de pacotes.
As pessoas geralmente mantêm pacotes publicados pub.devem seu tempo livre. Isso pode ser caro, tanto em termos de tempo quanto de finanças. Para facilitar os patrocínios, agora oferecemos suporte a uma nova fundingtag no pubspec, que pode ser usada por editores de pacotes para listar links para uma ou mais formas de patrocinar o pacote. Esses links são exibidos pub.devna barra lateral:
Para saber mais, consulte a pubspecdocumentação .
Além disso, gostaríamos de encorajar um rico ecossistema de pacotes de código aberto. Para destacar isso, a pontuação automática do pacote pub.devconcede 10 pontos adicionais para pacotes que usam uma licença aprovada pela OSI .
Algumas mudanças de quebra
Dart tem um forte foco na simplicidade e facilidade de aprendizado. Estamos constantemente tentando manter um equilíbrio cuidadoso ao adicionar novos recursos. Um método para manter as coisas simples é remover funcionalidades históricas e APIs com pouco uso ou substituições melhores. O Dart 2.18 limpa itens nesta categoria, incluindo algumas mudanças menores:
- Adicionamos a
dartferramenta de desenvolvedor CLI unificada em outubro de 2020. Em 2.18, concluímos a transição. Esta versão remove as duas últimas ferramentas obsoletasdart2js(usedart compile js) edartanalyzer(usedart analyze). - Com a introdução do versionamento de idiomas,
pubgera um novo arquivo de resolução:.dart_tool/package_config.json.O arquivo anterior,.packages, usava um formato que não podia conter versões. Descontinuamos o uso do.packagesarquivo. Se você tiver algum.packagesarquivo, poderá excluí-lo. - Mixins de classes que não estendem
Objectnão podem ser usados (alteração de quebra #48167 ). Esse comportamento nunca foi intencional. - A
uripropriedade dedart:io'sRedirectExceptionfoi alterada para anulável (alteração significativa #49045 ). - As constantes nas
dart:ioAPIs de rede de seguindo a convenção SCREAMING_SNAKE foram removidas (alteração de última hora #34218 ; anteriormente obsoleta). Em vez disso, use as constantes lowerCamelCase correspondentes. - A VM Dart não restaura mais as configurações iniciais do terminal ao sair. Programas que alteram as
StdinconfiguraçõeslineModeeechoModeagora são responsáveis por restaurar as configurações após a saída do programa (alteração de última hora #45630 ).
Estamos muito satisfeitos em ver o amplo uso da segurança nula desde seu lançamento beta em novembro de 2020 e o lançamento do Dart 2.12 em março de 2021.
Primeiro, os desenvolvedores de aplicativos de quase todos os pacotes populares pub.devmigraram para segurança nula. A análise mostra que 100% dos 250 principais e 98% dos 1.000 pacotes mais usados suportam segurança nula.
Em segundo lugar, a maioria dos desenvolvedores de aplicativos trabalha em bases de código com migração de segurança nula completa. Isso é crucial. A segurança nula de som completo do Dart não entra em ação até que você migre todo o código e todas as dependências (incluindo transitivas). Estamos rastreando isso via telemetria de flutter runcomandos.
O gráfico a seguir mostra as execuções de segurança nula insalubres versus sólidas de flutter run. Antes da introdução da segurança nula, não havia nenhum dos dois. Seguiu-se um rápido crescimento da segurança nula doentia. Como os aplicativos começaram a migrar para segurança nula, os desenvolvedores fizeram uma migração parcial. Algumas partes ainda precisavam ser migradas. Com o tempo, vemos um crescimento muito saudável de sessões de segurança nula sólidas. No final do mês passado, havia quatro vezes mais sessões de segurança nula sólidas em comparação com as insalubres. Esperamos que, ao longo dos próximos trimestres, veremos a segurança nula sólida se aproximar de 100%!
Uma atualização importante do roteiro de segurança nula
O suporte à segurança nula insalubre e sólida adiciona sobrecarga e complexidade.
Primeiro, os desenvolvedores do Dart precisam aprender e entender os dois modos. Sempre que ler um código Dart, verifique a versão do idioma para ver se os tipos são não nulos por padrão (Dart 2.12 e posterior) ou anuláveis por padrão (Dart 2.11 e anterior).
Em segundo lugar, o suporte a ambos os modos em nossos compiladores e tempos de execução retarda a evolução do Dart SDK para oferecer suporte a novos recursos.
Com base na sobrecarga de segurança nula insalubre e nos números de adoção muito positivos mencionados na seção anterior, nosso objetivo é fazer a transição para oferecer suporte apenas à segurança nula sólida e descontinuar os modos de segurança não nula e segurança nula insalubre. Temos provisoriamente programado para lançamento em meados de 2023.
Isso significaria a descontinuação do suporte para Dart 2.11 e versões anteriores. Arquivos Pubspec com uma restrição de SDK com um limite inferior inferior a 2,12 não seriam mais resolvidos no Dart 3 e posterior. No código-fonte contendo marcadores de idioma, eles falhariam se definidos para menos de 2,12 (como // @dart=2.9).
Se você migrou para a segurança nula sólida, seu código funcionará com segurança nula total no Dart 3. Se ainda não migrou, migre agora! Para saber mais sobre essas alterações, consulte este problema do GitHub .
Resumo
O novo suporte para interoperabilidade, rede, inferência de tipo pub.devestá disponível hoje. Para começar, você pode baixar diretamente a versão Dart 2.18 ou incorporá-la como parte da versão atual do Flutter 3.3 SDK.





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)