Prévia do material em texto
Gerenciamento de dependências em Flutter Apresentação Ao desenvolver uma aplicação, quando um objeto é criado, alguns requisitos devem ser cumpridos para que possa funcionar corretamente. Tudo que é necessário, é considerado uma dependência. Para isso, nos últimos tempos, o Flutter tem se tornado bastante popular. Isso porque, os objetos geralmente dependem uns dos outros e em Flutter, ao falar de dependência, se está fornecendo aos objetos do sistema outros objetos dos quais eles dependem com baixo acoplamento. Por isso, diversas empresas estão adotando o Flutter, como o Nubank. Como forma de reduzir o tempo de desenvolvimento, o Flutter suporta a inclusão de pacotes compartilhados fornecidos por outros desenvolvedores, direcionados para aplicações Flutter e Dart. Com essa proposta, é possível reduzir o tempo de construção de um aplicativo, justamente por não ser necessário desenvolver tudo do zero. A utilização de pacotes de terceiros acarreta a inclusão de dependências no aplicativo desenvolvido, que podem ser administradas por meio de gerenciadores de dependências — no caso do Flutter, tem-se o pub.dev como referência principal. Aliado ao repositório, arquivos específicos são utilizados para intermediar esse gerenciamento, realizando a instalação, a atualização e a remoção, afastando essa obrigação do desenvolvedor. Nesta Unidade de Aprendizagem, você vai aprender um pouco mais sobre as diferenças entre pacotes (packages) e plugins e vai entender como é feita a gerência de suas dependências no pub.dev. Por meio de exemplos de aplicação, você terá uma visão mais abrangente das vantagens de sua utilização. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Diferenciar packages e plugins.• Gerenciar dependências disponibilizadas no pub.dev. • Consumir packages e plugins.• Desafio Cada vez mais, o perfil das agências de desenvolvimento de softwares tem se especializado no atendimento à crescente demanda por aplicativos para dispositivos móveis. Com isso, frameworks como o Flutter têm ganhado muito espaço no mercado. A maioria dessas empresas padroniza seus processos desde o momento da criação, como forma de organizar o trabalho e agilizar manutenções futuras. Algumas padronizações já têm início no momento de criação do projeto. Nesse sentido, acompanhe a situação a seguir: Considerando os requisitos e as dependências listadas, apresente o código do arquivo pubspec.yaml inicial preenchido com os requisitos solicitados. Demonstre o arquivo com as configurações solicitadas. Infográfico Cada projeto Flutter inclui um arquivo pubspec.yaml, conhecido geralmente por pubspec, que é gerado durante a criação de um projeto. Ele contém metadados sobre o projeto, bem como outras informações importantes. Além de especificar as dependências que o desenvolvimento do projeto requer, ele também contém referências a recursos como fontes ou arquivos de imagem. Ademais, especifica outros requisitos, como dependências em pacotes de desenvolvedor (como pacotes de teste ou simulação) ou restrições específicas na versão do Flutter SDK. Neste Infográfico, você vai entender um pouco mais sobre a configuração básica de um arquivo pubspec e como ele é subdividido. Conteúdo interativo disponível na plataforma de ensino! Conteúdo do Livro Gerenciadores de dependências permitem que desenvolvedores selecionem quais dependências serão essenciais para uma aplicação funcionar. Tais ferramentas realizam esse gerenciamento efetuando instalações e atualizações ou removendo essas dependências, conforme as necessidades do projeto. Para tanto, o Flutter utiliza um arquivo chamado pubspec.yaml, no qual o desenvolvedor pode definir quais pacotes ou plugins o projeto necessita para funcionar e as configurações necessárias para gerenciar as dependências de forma eficaz. No capítulo Gerenciamento de dependências em Flutter, base teórica desta Unidade de Aprendizagem, você vai conhecer os conceitos de packages e plugins e vai compreender o processo de gerência de dependências disponibilizadas no pub.dev. Também serão apresentados exemplos de aplicação de packages e plugins. Boa leitura. DESENVOLVIMENTO MOBILE OBJETIVOS DE APRENDIZAGEM > Diferenciar packages e plugins. > Gerenciar dependências disponibilizadas no pub.dev. > Consumir packages e plugins. Introdução O Flutter é um framework multiplataforma para desenvolvimento de aplicativos Android e iOS. Contando com uma comunidade ativa, tem uma ampla quantidade de pacotes e plugins. Esses pacotes são projetados para reutilização e inclusão em qualquer projeto, ampliando as funcionalidades e reduzindo o tempo para desenvolvimento. O uso de pacotes, como já mencionado, reduz a necessidade de desenvolver o projeto todo “do zero”, mas gera uma dependência entre o aplicativo e o pacote instalado. Essa dependência traz impactos na gerência de manutenção, correções e compatibilidade entre as versões dos próprios pacotes. Essa gerência das dependências pode se tornar um processo complexo e improdutivo de acordo com o número de pacotes utilizado, complexidade esta que aumenta conforme incluímos em nossa gerência o controle das dependências que os pacotes utilizados também possam ter. Para minimizar esse processo, utilizamos gerenciadores de dependentes que automatizam grande parte do processo de Gerenciamento de dependências em Flutter Marcelo da Silva dos Santos gestão. Flutter utiliza o arquivo pubspec.yaml como principal fonte de gerência e configuração das dependências do projeto, podendo inclusive coordenar essas atualizações diretamente com o repositório de pacotes do Flutter, o pub.dev. Neste capítulo, você vai conhecer os conceitos relacionados ao gerenciamento de dependências, bem como os conceitos de pacotes e plugins. Ao final, alguns exemplos de utilização de pacotes e plugins serão apresentados. Introdução ao gerenciamento de dependências O desenvolvimento de sistemas vem se expandindo ao longo das últimas décadas. O potencial e a importância do software eram questionados, tendo o hardware o todo o destaque. Desde seus primórdios, partindo da tábua de calcular até os grandes mainframes IBM, o hardware ganhava todo o destaque nos estudos computacionais. Por volta dos anos 1960, a história teve uma reviravolta e, como resultado, atualmente diversos segmentos (indústria, negócios, governo, ciência, dentre outros) são dependentes de sistemas de informação que auxiliam em tomadas de decisão, automatização e gestão. Esses sistemas estão mais inseridos em nossas vidas do que conseguimos perceber, desde análises comportamentais em redes sociais, a automatização dos controles em uma aeronave ou, simplesmente, o pedido de uma refeição pelo smartphone. Devido a essa rápida expansão, o início do aumento de escala dos sistemas sofreu importante impacto, sobretudo porque, naquele momento, os proces- sos de desenvolvimento eram relativamente imaturos. Garantir qualidade de projetos de grande escala (confiabilidade, usabilidade, segurança, entre outras características) era inviável, pois as ferramentas para desenvolvimento e gestão desenvolvidas até então não supriam tal necessidade. Esse cenário levou ao aumento da descrença no software, devido a recorrentes perdas de prazo, orçamento elevado, falta de atendimento aos requisitos e manutenção inviável. A apreensão era tanta que esse período foi chamado de “crise do software” (VALENTE, 2020). Muito se devia ao processo de manufatura de um sistema, sistemas novos eram criados do zero, muitas vezes aproveitando partes de outros projetos de forma direta, em outras palavras “copiando e colando”. Apesar de resolver Gerenciamento de dependências em Flutter2 o problema, essa prática também tem suas desvantagens; como exemplo, considere que precisamos realizar o acesso a uma base de dados, nesse caso, o desenvolvedor poderia copiar o trecho e alterar os aspectos necessários.Até esse ponto está tudo certo, mas se descobrirmos futuramente algum erro de funcionamento no código original, esse erro será replicado em todos os pontos para onde ele foi copiado e, caso não tenhamos uma documentação adequada, vamos ter retrabalho em buscar todos os sistemas e locais onde o trecho foi utilizado. Com a evolução dos padrões e princípios de desenvolvimento, os processos de reutilização de código evoluíram para construção de módulos, ou seja, em vez de copiar diretamente o código, passou-se a utilizar pacotes projetados e construídos para reaproveitamento e que encapsulam funcionalidades especí- ficas, como o acesso ao banco. Tais pacotes eram adicionados manualmente ao projeto em desenvolvimento. Isso gera aumento de produtividade e facilidade de aumento da escala do projeto, mas também gera uma dependência entre eles, pois o projeto que utiliza o pacote fica dependente do módulo utilizado, o que pode trazer novos desafios ao desenvolvedor. Muitos desses pacotes são gerenciados por comunidades de desenvolve- dores, algumas mais ativas do que outras. Quanto mais ativa a comunidade, mais atualizações, funcionalidades e correções são efetuadas e, se o ge- renciamento desses pacotes é manual, dependendo do número de projetos em que estamos envolvidos, é quase impossível acompanhar todas as atu- alizações do módulo utilizado, principalmente quando se trata das versões e compatibilidades. Um detalhe é que frequentemente esses módulos de terceiros também utilizam módulos de outras comunidades parceiras no seu desenvolvimento, gerando novas dependências em cascata e aumentando exponencialmente a complexidade de acompanhamento manual, tornando impossível gerenciar dessa forma. Como forma de reduzir essa complexidade e os impactos de possíveis falhas, a automatização desse processo por meio de sistemas gerenciadores é cada vez mais comum. Com a utilização dos gerenciadores de dependências, os desenvolvimentos podem gerenciar melhor o seu tempo e, inclusive, buscar com maior facilidade algum pacote que implemente alguma necessidade do projeto. A partir do uso de gerenciadores de dependências, as ações como busca, inclusão, remoção e atualização, além do rastreamento em cascata das dependências dos pacotes empregados no projeto, também são obtidas. Gerenciamento de dependências em Flutter 3 Diversas linguagens já possuem seus gerenciadores de dependências, como as listadas a seguir. � Maven: um dos mais famosos gerenciadores para Java. Também faz a gerência para Kotlin. � Composer: gerenciador de dependências do PHP. � PEAR Installer: outro exemplo de gerenciador PHP. � NPM: voltado para aplicações web e JavaScript. � Yarn: outro exemplo de gerenciador JavaScript. � Gradle: gerenciador de dependências Java, Groovy, Kotlin, Android, Scala e JavaScript. � NuGet: gerenciador de dependências .NET. � Pip: gerenciador de dependências Python. � Rubygem: gerenciador de dependências Ruby. Cada linguagem tem suas comunidades de desenvolvedores e suas próprias ferramentas para gerenciamento de pacotes, plugins e dependências. No caso do Flutter, podemos citar o pub.dev como um dos principais repositórios e gerenciadores. Mas antes de nos aprofundarmos melhor nessa ferramenta, vamos ver como o Flutter entende os conceitos de pacotes e plugins. Pacotes e plugins Como já comentado anteriormente, o Flutter também suporta o uso de pacotes de terceiros, ou seja, pacotes para funcionalidades específicas desenvolvidos e compartilhados por outros desenvolvedores compatíveis e padronizados para projetos Flutter e Dart. Também já comentamos as vantagens da uti- lização dessas funcionalidades, tanto na redução no tempo estimado para construção dos sistemas quanto na segurança no controle das atualizações e manutenção da aplicação. No pub.dev, gerenciador de pacotes para Flutter, vamos encontrar dois termos recorrentes: packages (ou pacote, em tradução para o português) e plugins. Gerenciamento de dependências em Flutter4 � Pacotes — De forma resumida, um pacote (ou package) é um diretório (pasta) que será incluído junto à árvore de diretórios de seu projeto. Entre os arquivos de código específicos para a funcionalidade a qual ele se destina, ele contém um arquivo de configuração, chamado de pubspec (o pubspec.yaml lista as dependências do pacote e inclui outros metadados, como um número de versão), e outros arquivos que podem ser necessários, como outras dependências (listadas no pubspec), bibliotecas Dart, recursos, testes, imagens e exemplos. No pub.dev podemos buscar uma grande variedade desses pacotes, grande parte desenvolvidos por engenheiros do Google e por comu- nidades de desenvolvedores Flutter e Dart. � Plugins — podem ser considerados como um tipo diferenciado de pacote, que provê funcionalidades da plataforma Flutter para o aplicativo. Os plugins também podem ser escritos para Android (usando Kotlin ou Java), iOS (usando Swift ou Objective-C), web, macOS, Windows, Linux ou qualquer combinação deles. Como exemplo, podemos utilizar um plugin para controlar a câmera de um dispositivo em uma aplicação Flutter. São muitos os exemplos de aplicação de pacotes e plugins, como acessar componentes do dispositivo (como a câmera), realizar requisições HTTP, tra- tar rotas ou integrar com alguma API. Além disso, podemos escrever nossos próprios pacotes e, se todos os parâmetros do repositório forem seguidos, até podemos submeter para o compartilhamento do pub.dev. Conhecendo o pub.dev O pub.dev, como já foi comentado, é um repositório de projetos e gerenciador de dependências para Flutter e Dart. Nele podemos localizar e incluir em nosso projeto qualquer pacote e plugin disponibilizado. Logo que carregamos a página (Figura 1), nos deparamos com algumas categorias em destaque, como os favoritos, pacotes mais populares e os top 10 do Flutter e do Dart. Para realizarmos a busca por uma funcionalidade, basta utilizar palavras-chave relacionadas com o que estamos buscando. Gerenciamento de dependências em Flutter 5 Figura 1. Tela do pub.dev. Fonte: Dart... (2021, documento on-line). Imagine que você precise validar sequências de CPF ou CNPJ para validação de formulários, por exemplo; poderia, então, pesquisar utilizando a palavra- -chave CPF. Como resultado, teremos todos os pacotes que se encaixam em nossa pesquisa (dependendo do caso, talvez os termos de busca tenham que ser mais bem refinados). No pub.dev (2021, documento on-line) podemos enriquecer nossas consul- tas utilizando algumas palavras-chave, que auxiliam a melhorar a assertividade dos resultados, como as descritas a seguir. � "frase exata" — Por padrão, quando você realiza uma pesquisa, os resultados incluem pacotes com frases semelhantes. Quando uma frase está entre aspas, você verá apenas os pacotes que contêm exa- tamente a frase especificada. � package:prefix — Pesquisa pacotes que começam com prefix. Use esse recurso para localizar pacotes na mesma estrutura. Gerenciamento de dependências em Flutter6 � dependency:package_name — Pesquisa pacotes que fazem referência package_name em seus pubspec.yaml. � dependency*:package_name — Pesquisa por pacotes que dependem de package_name (como dependências diretas, dev ou transitivas). � email:user@example.com — Pesquisa pacotes em que o autor ou o uploader tenham o endereço de e-mail especificado. Outra forma de melhorar os resultados é com o uso dos filtros. � À esquerda da barra de pesquisa, selecione “Dart” ou “Flutter”, depen- dendo do SDK com o qual você está desenvolvendo. � À direita da barra de pesquisa, clique nos botões de filtro de plataforma para filtrar os resultados dos pacotes que suportam as plataformas para as quais você precisa de suporte. � Para usar filtros de plataforma para plataformas alfa (por exemplo, Flutter Desktop), use a opção Avançado na extremidade direita da barra de pesquisa. Veja outras formas de identificar os pacotes mais adequados.� Classificação — As listagens padrão usam uma composição das três pontuações para classificar os pacotes. A classificação é baseada na pontuação composta e, se aplicável, na especificidade da plataforma e na pontuação de correspondência de texto da equipe de pesquisa. � Pacotes legados — pub.dev não expõe pacotes que suportam apenas o Dart SDK 1.x nos resultados da pesquisa ou nas páginas de listagem. No entanto, é possível acessar esses pacotes por meio da página do pacote (/packages/) e o cliente pub pode baixá-los. Para pes- quisar esses pacotes, inclua is:legacy na consulta de pesquisa. � Favoritos — No pub.dev existe uma lista dos “pacotes favoritos” (Flut- ter Favorites Program). Essa lista possui os pacotes e plugins que os desenvolvedores devem considerar quando estiverem construindo seu aplicativo. Ela segue um conjunto de métricas e é definida por um comitê composto por membros da comunidade Flutter. Na Figura 2, podemos visualizar a listagem obtida a partir de nossa busca. Cada resultado também apresenta um conjunto de informações pertinentes, como sua pontuação, popularidade entre os usuários, dentre outros. Gerenciamento de dependências em Flutter 7 Figura 2. Tela do pub.dev apresentando listagem de pacotes após a busca. Fonte: Search... (2021, documento on-line). Ao selecionar um dos itens, podemos ver outras informações sobre o pacote, na aba pontuações (score), onde podemos ter dados sobre a documen- tação, suporte para múltiplas plataformas e atualizações das dependências, dentre outras. E por que essas informações são importantes? Sabendo que um módulo recebe atualizações frequentes e que a comunidade é ativa, logo, a possibilidade de seu desenvolvimento ser abandonado é menor, e consequen- temente, a possibilidade de manutenções para substituição desses módulos também é menor, citando somente um exemplo. Uma boa documentação também é um indício de qualidade, ou seja, quanto melhor a pontuação, mais robusto e confiável (menor a possibilidade de retrabalho e erros no projeto). Gerenciamento de dependências em Flutter8 Figura 3. Tela do pub.dev mostrando aba de scores (pontuações) de um pacote. Fonte: cpfcnpj... (2019, documento on-line). Ainda nesta área, encontramos outras abas importantes. � Readme (leia-me) — É uma descrição sucinta sobre o módulo. Aqui podemos encontrar informações sobre o uso do pacote. � Changelog (alterações) — É o registro das últimas alterações (correções, atualizações, dentre outras) executadas nos componentes do pacote. � Example (exemplo) — São exemplos de aplicação e configuração do pacote. � Installing (instalando) — São as instruções de como o pacote deve ser carregado no projeto. � Versions (versões) — É um registro histórico das versões estáveis li- beradas para utilização. � Scores (pontuações) — É a pontuação recebida pelo pacote, com base em quesitos como adesão às regras da comunidade e as convenções da linguagem, documentação robusta e com exemplos, abrangência e suporte a múltiplas plataformas, suporte e atualização de depen- dências, dentre outras. Gerenciamento de dependências em Flutter 9 Para utilização do pacote, podemos primeiro verificar as indicações da aba Installing; na Figura 4, é indicado adicionar a dependência do pacote ao arquivo pubspec.yaml. Esse arquivo é responsável pela gerência dos pacotes ativos e de suas dependências em um aplicativo Flutter. Figura 4. Configuração padrão do arquivo pubspec.yaml. Nele vamos adicionar cpfcnpj (1.0.3 ou superior) à lista de dependências. Note que o arquivo original do projeto já possui a dependência do pacote Cupertino (Cupertino _ icons), necessária para utilização de ícones do iOS em aplicativos Flutter, incluídos automaticamente. Vamos adicionar nossa dependência nesse mesmo local (Figura 5). Figura 5. Adicionando uma dependência ao projeto. Logo após, o próximo passo é fazer o download e incluir os arquivos do pacote no nosso projeto. Dependendo do editor que você estiver utilizando, poderá encontrar pequenas diferenças na nomenclatura da funcionalidade. No Android Studio teremos o botão Pub get disponível na interface somente Gerenciamento de dependências em Flutter10 enquanto o arquivo está em edição. Já em outras ferramentas (como o Eclipse), a funcionalidade é Package get. Sua execução realizará a comunicação com o repositório, o download e a instalação dos pacotes na estrutura do projeto. Você também pode executar a ação no console, em linha de comando, como na Figura 6. Figura 6. Processo de instalação dos pacotes após edição do arquivo pubspec.yaml. (a) Imagem do editor de código Visual Studio, com a funcionalidade Pub get disponível para o arquivo de configuração. (b) Imagem do console (prompt) executando a função Pub get por linha de comando. a b Durante o processo de instalação do Pub get, também será gerado o arquivo pubspec.lock, que terá a relação de todos os pacotes incluídos no projeto e seus respectivos versionamentos. Para completar a ação, precisamos agora importar o pacote em nosso projeto, e, para isso, vamos editar o arquivo localizado em lib/main.dart e incluir a importação do novo pacote (Figura 7). Figura 7. Importação do pacote instalado no arquivo main.dart. Agora estamos prontos para testar nossa nova funcionalidade. Você pode utilizar o trecho de código para teste indicado na documentação do pacote, aquele disponível na aba Exemplo. Vamos incluí-lo no mesmo arquivo em que acabamos de adicionar a importação (Figura 8). Gerenciamento de dependências em Flutter 11 Figura 8. Inserindo o código de teste disponibilizado pelo autor do pacote. Na Figura 9, você pode verificar o exemplo e seu resultado da execução do teste no console do editor. Figura 9. Resultado do teste após edição do arquivo main.dart. Assim temos certeza de que tudo foi configurado corretamente e esta- mos prontos para acessar as novas funcionalidades e utilizá-las em nossa aplicação. Você deve ter notado a importância do arquivo pubspec.yaml na configuração e no controle das dependências do projeto; na próxima seção, vamos explorar melhor sua configuração, bem como o controle de versões. Gerenciamento de dependências em Flutter12 Gerenciamento de dependências e o arquivo pubspec Como visto anteriormente, o processo de gerenciar as atualizações, correções e dependências em cascata (que os pacotes incluídos possam ter) torna-se um complexo e improdutivo para ser realizado manualmente, se somado à possibilidade latente de erros, falta de rastreamento das dependências em pacotes de terceiros, dentre outros problemas. Outro ponto estudado foram os primeiros passos para inclusão de um pacote e sua configuração inicial e, para tanto, conhecemos o arquivo pubspec.yaml. Cada projeto em Flutter terá um arquivo pubspec.yaml, geralmente cha- mado somente de pubspec pelos desenvolvedores. Sua estrutura básica é gerada ao criar um projeto Flutter e possui um conjunto de metadados sobre o projeto. Isso é escrito com a linguagem YAML, muito semelhante a sintaxe do JSON, de fácil leitura por humanos, mas com suas particularidades; por exemplo, ele reconhece tabulações e espaços como parte da sintaxe, logo as indentações e alinhamentos do código levadas em consideração na execução do código (assim como python). Como curiosidade, YAML é um acrônimo recursivo para “YAML ain’t markup language” (YAML não é linguagem de marcação, traduzindo para o português). Voltando ao pubspec, ele define as dependências que o projeto requer, como pacotes específicos (e suas versões), arquivos de fontes ou de ima- gens. Também define outros requisitos, como dependências em pacotes de desenvolvedor (pacotes de teste ou simulação) ou restrições específicas na versão de pacotes. Na primeira construção do seu projeto, também é criado o arquivo pubspec.lock, que contém versões específicas dos pacotes incluídos. Isso garante que você obtenha a mesma versão na próxima vez que o projeto forconstruído. Quando você cria um projeto com o Flutter, automaticamente é gerado um arquivo pubspec com configurações básicas para a aplicação. O arquivo é subdividido em diferentes seções, as quais você pode observar na Figura 10. Gerenciamento de dependências em Flutter 13 Figura 10. Exemplo de configuração inicial básica de um arquivo pubspec.yaml. Seção Metadados A primeira parte do arquivo é destinada à definição dos metadados, ou seja, as informações sobre os dados contidos nele. Logo no início, encontramos o parâmetro name, responsável por identificar o nome do projeto. Outro campo observado é description, que, como imaginado, é utilizado para inserir uma descrição do objetivo da aplicação (campo opcional). Caso esse pacote seja publicado do pub.dev, essas informações ficarão disponíveis na identificação do pacote. Recordando o exemplo apresentado na Figura 10, o valor incluído no campo description é “Um utilitário fácil de usar para validação e formatação de CPF/CNPJ”. Gerenciamento de dependências em Flutter14 O campo version informa a versão do aplicativo, ou seja, permite o controle de versão do aplicativo para o usuário e para as lojas de aplicativos (Google Play Store e iOS App Store, por exemplo). No exemplo da Figura 10, observamos a versão 1.0.0+1, o que significa que nosso aplicativo está na versão 1.0.0 com versão de compilação 1. Outros campos opcionais podem ser incluídos como metadados, como author (indica o nome do desenvolvedor), homepage (página do projeto), issue _ track (página com os issues do projeto) e repository (um github, por exemplo). Seção Environment (ambiente) Na seção seguinte, encontramos os campos relacionados ao ambiente da aplicação. Nele podemos incluir alguma restrição relacionada a SDK do Dart e à versão do Flutter. Por exemplo, ao definir: environment: sdk: ">=2.7.0 =2.7.0 =5.4.0 =1.2.3 =0.1.2com mais detalhes o arquivo responsável pela gerência de dependências do Flutter. Na próxima seção, você vai conhecer exemplos de consumo de packages (pacotes) e plugins. Exemplo de utilização de packages e plugins A seguir, serão demonstrados dois exemplos de utilização, um de pacote e um de instalação de plugin. Tais exemplos servem de base para implantação de quaisquer outros pacotes necessários ao projeto, basta buscá-los no pub. dev e incorporá-los ao seu desenvolvimento. Gerenciamento de dependências em Flutter 19 Exemplo de configuração do pacote css_colors Como primeiro exemplo, vamos incluir a dependência para o pacote css _ co- lors (USING..., 2021). Sua atribuição é definir constantes para cores em CSS. Com ele, podemos utilizar constantes sempre que houver a necessidade de trabalhar com o tipo Color. Para usar esse pacote: � crie um projeto chamado exemplo _ pacote _ color; � abra pubspec.yaml, e adicione a dependência css-colors: dependencies: flutter: sdk: flutter css _ colors: 1̂.0.0 Execute flutter pub get no terminal ou acione a função para buscar os pacotes (pub get, por exemplo). Abra no editor o arquivo lib/main.dart e inclua o exemplo disponível no repositório pub.dev, no pacote css_colors (2021, documento on-line), dessa forma: import 'package:css _ colors/css _ colors.dart'; import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: DemoPage(), ); } } Gerenciamento de dependências em Flutter20 class DemoPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold(body: Container(color: CSSColors.orange)); } } Agora vamos ao teste, para isso execute o aplicativo. Caso tudo esteja correto, o plano de fundo do seu aplicativo de teste deve estar na cor laranja. Exemplo de configuração do plugin url _ launcher Um pacote de plugin, como já comentado anteriormente, tem estrutura se- melhante a um pacote comum, com a diferença de ser uma funcionalidade específica para atender a alguma necessidade. Neste exemplo, vamos tra- balhar com o plugin url_launcher (FLUTTER..., 2021), uma funcionalidade que nos permite abrir o navegador padrão do dispositivo móvel e carregar um determinado URL. Novamente, vamos a configuração de dependência para o plugin em nosso projeto: � crie um projeto chamado exemplo _ plugin _ launch; � abra pubspec.yaml, e adicione a dependência url _ launcher: dependencies: flutter: sdk: flutter url _ launcher: ^5.4.0 Abra no editor o arquivo lib/main.dart e inclua o exemplo disponí- vel no repositório pub.dev, agora no pacote url_launcher (2021, documento on-line), dessa forma: import 'package:flutter/material.dart'; import 'package:url _ launcher/url _ launcher.dart'; Gerenciamento de dependências em Flutter 21 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: DemoPage(), ); } } class DemoPage extends StatelessWidget { launchURL() { launch('https://flutter.dev'); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: launchURL, child: Text('Show Flutter homepage'), ), ), ); } } Pronto, agora basta executar o aplicativo e testar a funcionalidade nova. Para tanto, clique em Mostrar página inicial do Flutter, e você deverá ver o na- vegador padrão aberto no dispositivo, exibindo a página inicial do flutter.dev. Gerenciamento de dependências em Flutter22 Neste capítulo, você conheceu um pouco mais sobre gerenciamento de dependências em Flutter, sua importância e como esse processo pode ser realizado. Você conheceu o pub.dev, que além de ser um gerenciador de dependências do Flutter, é um dos principais repositórios da comunidade. Lá estão catalogadas todas as soluções compartilhadas pela comunidade, organizadas e pontuadas pelos próprios usuários, servindo de referência e comparativo entre soluções semelhantes. Com o aumento das necessidades do mercado, as aplicações tornam-se também mais complexas, e poder expandir as funcionalidades utilizando pacotes e plugins de qualidade traz vantagens para o seu negócio e, consequentemente, para seu cliente. Referências CPFCNPJ 1.0.3. pub.dev, [S. l.], 2019. Disponível em: https://pub.dev/packages/cpfcnpj. Acesso em: 22 jun. 2021. CSS_COLORS 1.1.1. pub.dev, [S. l.], 2021. Disponível em: https://pub.dev/packages/ css_colors. Acesso em: 22 jun. 2021. DART packages. pub.dev, [S. l.], 2021. Disponível em: https://pub.dev/. Acesso em: 22 jun. 2021. FLUTTER documentation. Flutter, [S. l.], 2021. Disponível em: https://flutter.dev/docs. Acesso em: 22 jun. 2021. SEARCH results for CPF. pub.dev, [S. l.], 2021. Disponível em: https://pub.dev/ packages?q=CPF. Acesso em: 22 jun. 2021. URL_LAUNCHER 6.0.7. pub.dev, [S. l.], 2021. Disponível em: https://pub.dev/packages/ url_launcher. Acesso em: 22 jun. 2021. USING packages. Flutter, [S. l.], 2021. Disponível em: https://flutter.dev/docs/deve- lopment/packages-and-plugins/using-packages#examples. Acesso em: 22 jun. 2021. VALENTE, M. T. O. Engenharia de software moderna: princípios e práticas para desenvol- vimento de software com produtividade. Belo Horizonte: Edição do autor, 2020. 408 p. Leituras recomendadas DART documentation. Dart, [S. l.], 2021. Disponível em: https://dart.dev/docs. Acesso em: 22 jun. 2021. MARINHO, L. H. Iniciando com Flutter Framework: desenvolva aplicações móveis no Dart Side! São Paulo: Casa do Código, 2020. 173 p. Gerenciamento de dependências em Flutter 23 Os links para sites da web fornecidos neste capítulo foram todos testados, e seu funcionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. Gerenciamento de dependências em Flutter24 Dica do Professor Pub.dev é o gerenciador de pacotes da linguagem de programação Dart, contendo bibliotecas e pacotes reutilizáveis para programas Flutter, Angular Dart e Dart, em geral. Sua página inicial apresenta os principais pacotes compatíveis com o Flutter (aqueles que declaram dependências geralmente compatíveis com o Flutter) e oferece suporte à pesquisa entre todos os pacotes publicados. A página lista os plugins e pacotes que podem estender as funcionalidades do aplicativo, reduzindo o tempo para desenvolvimento. Sua vasta galeria é organizada de forma a facilitar a localização e a escolha do pacote mais adequado para cada situação. Nesta Dica do Professor, você vai aprender um pouco mais sobre o pub.dev, os seus métodos de busca e algumas dicas para a escolha dos pacotes. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/36a31cd8af2256a13be382159bd7d992 Exercícios 1) O Flutter tem seu próprio gerenciador de pacotes, acessado a partir do pub.dev. Por meio dele, pode-se ter acesso a um vasto volume de recursos capazes de expandir a aplicação e minimizar o tempo de desenvolvimento. Além de fornecer uma interface simples e minimalista, esse gerenciador fornece um conjunto de chaves de busca para auxiliar a localização dos pacotes mais adequados. Considerando as formas de busca disponibilizadas pelo pub.dev, assinale a alternativa correta: A) Por padrão do pub.dev, os termos utilizados para realizar uma busca deverão ser inseridos entre aspas. B) Pode-se utilizar chaves de busca para localizar pacotes, informando o e-mail do desenvolvedor do pacote. C) Utiliza-sea chave dependency*: para buscar todos os pacotes que fazem referência ao termo pesquisado. D) Utiliza-se a chave de busca versions: para localizar o histórico das versões estáveis de um pacote. E) A chave de busca scores: é utilizada para a busca de pacotes com melhor pontuação entre os desenvolvedores. 2) O pubspec.yaml é o arquivo utilizado para o controle de dependências em aplicativos Flutter. Sua configuração básica envolve determinados parâmetros que definem diferentes aspectos e recursos da aplicação. Considerando a configuração básica desse arquivo, assinale a alternativa correta: A) Deve-se obrigatoriamente atribuir no pubspec, para cada aplicação Flutter, um conjunto de metadados, como version, name e author. B) Informações sobre os metadados do pacote são incluídas no topo do arquivo, como name, description, version e environment. C) Pode-se incluir dependências destinadas ao uso somente em ambiente de teste, como pacotes para teste ou geração de código. D) Caso a versão do Flutter utilizada seja informada em environment, pode-se dispensar o detalhamento individual na seção Flutter. E) Pode-se ocultar a versão de um pacote ao inseri-lo na propriedade dependencies; nesse caso, a ferramenta utiliza qualquer versão. 3) Seja qual for a linguagem, o controle de versões de um package deve receber especial atenção e padronização, sob pena de acarretar erros no aplicativo que o utiliza. Os packages Flutter seguem um padrão de controle adicionando três números logo após o nome do pacote. Considerando o controle de versões para o pacote Geolocator 7.0.3, assinale a alternativa correta: A) O incremento do major version é o mais crítico dos três valores, pois altera compatibilidades. B) A versão PATCH é incrementada quando se adicionam funcionalidades, mantendo a compatibilidade. C) A versão MAJOR será incrementada quando forem feitas mudanças incompatíveis na aplicação que a utiliza. D) A versão MINOR é incrementada quando adicionar funcionalidades sem manutenção da compatibilidade. E) Quando a versão MINOR é incrementada, devemos atribuir o valor zero para as versões PATCH e MAJOR. 4) A utilização de IDEs para desenvolvimento de código traz diversas facilidades ao desenvolvedor, incluindo ferramentas capazes de gerar código, organizar e trazer funções destinadas à gerência dos recursos do projeto. Esses ambientes, como o Android Studio e o Eclipse, trazem embutidas em sua interface funções destinadas ao gerenciamento de dependências e à implantação de pacotes necessários ao projeto. Considerando as funções relativas ao gerenciamento de dependências, assinale a alternativa correta: A) A função pub get é utilizada para realizar o download e a instalação dos pacotes necessários, mesmo com o pubspec fechado. B) Enquanto se está editando o arquivo pubspec, pode-se acionar a função pub upgrade para realizar o download dos pacotes necessários. C) A função pub downloader é utilizada para realizar o download e a instalação dos pacotes necessários, mesmo com o pubspec fechado. D) Em aplicações mais antigas, deve-se utilizar pacotes legados para impedir conflitos, e, nesse caso, utiliza-se a função pub legacy. E) Após incluir as dependências no arquivo pubspec, pode-se acionar a função pub get para realizar download dos pacotes necessários. 5) Por padrão, um pacote é formado por um conjunto de programas de dados organizado em uma unidade independente e que pode ser reutilizado. O pacote armazena diferentes funções e classes para um propósito ou utilitário específico, além do código compilado. O principal repositório de pacotes e gerenciador de dependências para Flutter é o pub.dev. Analise as afirmativas a seguir, que tratam do pub.dev, e classifique-as em verdadeiras (V) ou falsas (F): ( ) A ferramenta disponibiliza uma página de pontuações para cada pacote lá publicado, sendo que esses pontos dependem da avaliação da comunidade e da aderência às regras da comunidade. ( ) Pode-se encontrar pacotes por meio das listagens de pacotes indicados pela comunidade ou por busca direta. ( ) Após escolher o pacote a ser utilizado, deve-se utilizar a função pub get disponível na aba Instalação do pub.dev, indicando o nome do projeto em desenvolvimento, para iniciar o download e a instalação do pacote. Assinale a alternativa que indica a sequência correta: A) F — V — F. B) V — F — V. C) F — F — F. D) V — V — F. E) F — V — V. Na prática Com o aumento da escala de projetos e a busca constante por incrementar a produtividade das equipes, os pacotes de funcionalidades acabam sendo muito empregados. Esses pacotes podem oferecer diversas funcionalidades, desde a simples manipulação de cores dos elementos da interface até complexas funções de consumo e persistência de dados. Como alguns requisitos podem ser muito específicos para determinado segmento, alguns desenvolvedores optam por implementar seus próprios pacotes, para que possam ser reutilizados em seus projetos futuros. Acompanhe, Na Prática, um resumo dos passos para a criação de um pacote para consumir dados via JSON. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://statics-marketplace.plataforma.grupoa.education/sagah/95666dd5-022f-4914-865b-e8cead4fc7cd/033f1f41-6758-47e0-bfd5-95aba209f894.jpg Saiba mais Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Instalando packages externos (pub.dev) Neste vídeo, acompanhe o processo de instalação de pacotes diretamente do repositório pub.dev do Flutter. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. 10 packages para o Flutter feitos por brasileiros Neste vídeo, conheça 10 exemplos de packages criados por comunidades brasileiras de desenvolvimento Flutter. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Developing packages & plugins Nesta documentação oficial, descubra um pouco mais sobre pacotes e plugins, seus padrões de criação e como publicá-los no Pub.dev. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://www.youtube.com/embed/TR57h_hx5DU https://www.youtube.com/embed/p_bKpIzn4i0 https://flutter.dev/docs/development/packages-and-plugins/developing-packages Top 5 pacotes Flutter que você precisa conhecer Neste vídeo, acompanhe pacotes que podem ser utilizados no Flutter e os recursos que cada um deles oferece ao desenvolvedor. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Pub.dev Neste site, saiba mais sobre o repositório apresentado na Dica do Professor e no Na Prática. O Pub.dev é o gerenciador de pacotes da linguagem de programação Dart, contendo bibliotecas e pacotes reutilizáveis para aplicações Flutter e Dart. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://www.youtube.com/embed/Fc8D_6TtiKw https://pub.dev/