Anúncio do teste beta do DART de segurança nula. Inicie o processo de migração de pacotes para um estado seguro e protegido





Claro, null-safety é uma etapa importante no desenvolvimento da linguagem. A equipe Dart anunciou um lançamento beta da versão de segurança nula! Traduzimos para o russo as notícias sobre este lançamento, no qual você aprenderá como migrar para novas versões, quais benefícios obterá e qual é o benefício de segurança nula para todos nós.



Hoje estamos anunciando que um beta de segurança nula confiável está disponível para Dart e Flutter. Segurança nula é nosso mais recente grande avanço para ajudá-lo a evitar bugs de referência nula, uma classe de bugs que geralmente são difíceis de detectar. Este vídeo explica em termos gerais o motivo da nossa alegria:





Com a mudança para o beta de segurança nula, é hora de migrar os milhares de pacotes disponíveis no pub.dev . Portamos as bibliotecas principais do Dart, a estrutura Flutter e mais de 40 pacotes Dart e Flutter. Dito isso, esperamos que a comunidade aceite o null-safety ao migrar seus pacotes.







Com a versão beta, também estamos entrando na reta final antes que a versão estável de segurança nula seja lançada. Esperamos que você aproveite essa funcionalidade e nos informe se podemos melhorá-la e tornar as mensagens da IU e a documentação mais claras. Estamos ansiosos para seus comentários .



Escolha de segurança nula



Antes de discutir a migração para segurança nula, queremos reiterar que (conforme declarado em nossas diretrizes de segurança nula ) você tem a capacidade de escolher quando iniciar a migração. Aplicativos e pacotes só funcionarão com segurança nula se o limite mínimo do Dart SDK for pelo menos a versão de pré-lançamento do Dart 2.12:



environment:
 sdk: ">=2.12.0-0 <3.0.0"


Para experimentá-lo, tente criar um pequeno aplicativo hello de segurança nula (por exemplo, com dart create) contendo o código conforme mostrado abaixo. Você pode então tentar executar o aplicativo antes e depois de alterar o limite do SDK e iniciar dart pub gete ver como o comportamento do programa muda. (Certifique-se de dart --versionretornar exatamente 2,12 para você).



bin/hello.dart:
...
void main() {
  var hello = 'Hello Dart developers';
  if (someCondition) {
	hello = null;
  }
  print(hello);
}
 
Before changing the SDK constraint:
$ dart run
 
null
 
After changing the SDK constraint (and running dart pub get):

$ dart run
 
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of 
type 'String' because 'String' is not nullable.
 
	hello = null;
        	^


Movendo para segurança nula



Para migrar um pacote (ou um aplicativo simples) para o modo de segurança nula, siga estas cinco etapas, que são detalhadas no guia de migração dart.dev.



Etapa 1: verifique se suas dependências estão prontas



É altamente recomendável que você mova o código em ordem, começando com as "folhas" do gráfico de dependência. Por exemplo, se C depende de B, que depende de A, migre para a segurança nula A primeiro, depois B e depois C. Esta ordem se aplica se A, B e C são bibliotecas, pacotes ou aplicativos.







Por que o pedido é tão importante? Você pode fazer algum progresso na migração de seu código antes de migrar suas dependências, mas corre o risco de ter que executar novamente se suas dependências alterarem suas interfaces durante a migração. Se algumas de suas dependências não forem de segurança nula, considere entrar em contato com os editores do pacote usando os detalhes de contato listados para cada pacote em pub.dev.



Verificar se as dependências estão prontas



Para verificar se seu aplicativo ou pacote está pronto para iniciar a migração, você pode executar dart pub outdatedno modo de segurança nula. O exemplo a seguir mostra que a aplicação estará pronto para migrar se actualiza as suas dependências de path, processe pedanticpara, as versões de pré-lançamento listados na Resolúvel coluna .







Se o suporte de segurança nula estiver disponível em versões secundárias mais recentes, você os verá na coluna Atualizável . O suporte de segurança nula frequentemente estará disponível em novos lançamentos importantes; nesse caso, você verá as versões listadas na seção Resolvable na saída do utilitário desatualizado. Para alternar para eles, edite o arquivo pubspec.yamlpara permitir essas versões principais. Por exemplo, você pode mudar

process: ^3.0.13para process: ^4.0.0-nullsafety.



Você também pode encontrar pacotes com suporte de segurança nula no pub.dev usando as novas tags de segurança nula nas páginas do pacote (por exemplo, coleção 1.15 ) e a nova opção de pesquisa avançada de segurança nula.







Etapa 2: transferir usando a ferramenta de migração



Depois que as dependências estiverem prontas, você pode começar a migrar seu aplicativo ou pacote usando a ferramenta de migração dart migrate.



A ferramenta de migração é interativa, portanto, você pode visualizar as propriedades de segurança nula inferidas por esta ferramenta. Se você discordar de qualquer resultado da ferramenta, pode adicionar dicas nulas para alterá-lo. Adicionar apenas algumas dicas pode ter um grande impacto na qualidade de sua migração.







Vários autores de pacotes Dart testaram migrações usando compilações de segurança nula pré-compiladas e seus comentários foram encorajadores. O guia de migração contém dicas adicionais para usar a ferramenta de migração.



Etapa 3: análise estática do código portado



Atualize os pacotes usando pub get em seu IDE ou linha de comando. Em seguida, use um IDE ou linha de comando para realizar uma análise estática em seu código Dart:



$ dart pub get
$ dart analyze




Ou em código Flutter:



$ flutter pub get
$ flutter analyze


Etapa 4: certifique-se de que os testes sejam aprovados



Execute testes e certifique-se de que eles passam com segurança. Você pode precisar atualizar os testes esperando nulos se alterar o código do pacote para não permitir valores nulos.



Etapa 5: publique seu pacote de segurança nula



Depois de concluir a migração e executar os testes, você pode publicar seu pacote como um Pré-lançamento. Aqui está um resumo das melhores práticas:



  • Atualize a versão para a próxima versão principal (por exemplo, de 2.3.xpara 3.0.0). Isso garante que os usuários do seu pacote não atualizem até que estejam prontos para usar o null-safety. Isso dá a você a liberdade de refatorar sua API para fazer o melhor uso de segurança nula.
  • Traduza e publique seu pacote como uma prévia em pub.dev . (Por exemplo, use 3.0.0-nullsafety.0e não 3.0.0.)


Para obter mais informações sobre migração e controle de versão, consulte o guia de migração .



Benefícios da segurança nula garantida



Nossos posts anteriores sobre prévias técnicas de segurança nula no Dart e Flutter discutiram os benefícios dessas mudanças usando uma série de exemplos. Agora que a segurança nula está quase concluída, estamos vendo vários exemplos reais desse benefício.



Código mais seguro



Recentemente, descobrimos um bug no branch principal do Flutter que fazia com que vários comandos de ferramentas fluttertravassem em certas configurações de máquina com um null: error The method '>=' was called on null. O principal problema foi uma solicitação de pull recente para adicionar suporte para detecção do Android Studio 4.1. Esta solicitação pull adicionou um código como este:



final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
  /// plugin path of Android Studio changed after version 4.1.
  if (major >= 4 && minor >= 1) {
    ...


Você pode encontrar um bug? Como a versão pode ser nula, as versões principal e secundária também podem ser nulas. Esse bug pode parecer fácil de encontrar aqui isoladamente, mas na prática esse tipo de código passa despercebido o tempo todo, mesmo com o rigoroso processo de revisão de código usado no repositório Flutter. Com a segurança nula, a análise estática detecta esse problema imediatamente :







foi um erro bastante simples. Nos primeiros dias de uso de segurança nula no código interno do Google, vimos quantos erros mais complexos foram detectados e, em seguida, resolvidos por segurança nula. aqui estão alguns exemplos:



  • , null , null-safety null. , protobuf, , , null. , , - null .
  • Google Pay Flutter, - Flutter State Widget. null-safety null ; null-safety , null, .
  • Flutter , - Flutter , null scene Window.render(). null-safety , Scene , , null.


null-safety



A confiabilidade de segurança nula do Dart também é importante: os compiladores Dart podem tirar proveito das informações de segurança nula. Isso pode tornar seus programas menores e mais rápidos. Até agora, não temos muitos aplicativos reais totalmente traduzidos para segurança nula (afinal, estamos apenas começando a migrar o ecossistema de pacotes dos quais esses aplicativos dependem para confiabilidade), mas estamos vendo resultados muito encorajadores do framework principal.



Recentemente, executamos uma recompilação de teste da amostra hello_world para medir o impacto da segurança nula no tamanho do aplicativo. Este é um exemplo mínimo que exibe apenas "hello world". Ao comparardo tamanho total do código compilado, o tamanho do código descompactado (instalado no dispositivo) foi reduzido em 3,5% sem nenhuma ação além da recompilação com segurança nula confiável. Isso foi possível apesar do fato de que todo o aplicativo consistia em 10 linhas de código, porque o tamanho do código de todas as bibliotecas incluídas foi reduzido; por exemplo, o próprio framework Flutter ( package:flutter) encolheu 3,9%.



Em termos de velocidade de código, ter que impor um sistema de tipo de dados confiável aumenta potencialmente a sobrecarga. No entanto, menos verificações de nulos também podem acelerar seu código. A análise inicial dos benchmarks mostra que o desempenho está no mesmo nível das versões anteriores, e novas informações de tipo adicionais nos dão o potencial para novas maneiras de melhorar o desempenho no futuro. Planejamos escrever mais sobre isso em publicações futuras.



Em alguns casos, já vimos como a segurança nula levou a ganhos de desempenho quando a transição revelou uma falha na lógica do código. Por exemplo, encontramos um problema no cache de posicionamento de texto da Web do Flutter. Este cache usou uma chave anulável e então, de acordo com a lógica dada, usouTextAlign.startquando nulo. Essa lógica gerava um erro de cache onde os itens pareciam ter mudado, embora ainda tivessem um valor padrão. Como resultado, muitas vezes havia chamadas improdutivas para o cache. Adicionando getter textAlignque não permite nulo, ajuda a corrigir o cache de erro, resultando em maior performance de renderização do texto 14 vezes em casos de texto em cache.



Comece hoje!



As versões beta do Dart e Flutter contendo segurança nula estão prontas. Se você estiver escrevendo em Flutter, poderá mudar para beta com flutter channel betae depois flutter upgrade. E se você não estiver usando o Flutter, pode obter o Dart SDK autônomo no arquivo do Dart SDK .



Se você estiver desenvolvendo pacotes, recomendamos a leitura de nosso guia de migração e o planejamento de sua migração. Informe- nos sobre quaisquer problemas ou sugestões que você tenha.



Se você for um desenvolvedor de aplicativos, pode adiar a transferência até que o recurso apareça em nossas versões estáveis. Planejamos responder rapidamente ao feedback beta e corrigir quaisquer problemas restantes. É difícil fornecer um cronograma específico para quando o null-safety será lançado em uma versão estável, mas estamos pensando no início do próximo ano.



Obrigado pelo seu apoio e feedback! Estamos trabalhando para tornar o Dart uma linguagem mais robusta e o Flutter uma estrutura mais poderosa.



Michael Thomsen, gerente de produto da Dart and Flutter, postou este artigo no blog oficial da Dartlang. Se você gostaria de ouvir a palestra de Michael e interagir com ele pessoalmente, venha ao DartUP 2020 Online nos dias 4 e 5 de dezembro e discuta as últimas atualizações de idioma com a equipe Dart e a comunidade.



All Articles