Desenvolvimento React Native mais fácil com a Expo

Com o Expo, os desenvolvedores podem criar aplicativos React Native sem passar pelo incômodo de instalar e configurar dependências de software, como Android Studio, Xcode ou todas as outras ferramentas necessárias para desenvolver e executar um aplicativo React Native.

Neste tutorial, mostrarei como criar um jogo de memória simples usando a Expo. Ao longo do caminho, você também aprenderá o seguinte:

  • Como usar as ferramentas fornecidas pela Expo. Isso inclui a CLI, o SDK e o aplicativo cliente Expo.
  • Como criar um aplicativo React Native usando Expo.

O que é Expo?

Expo é uma estrutura para desenvolver rapidamente aplicativos React Native. É como Laravel ou Symphony para desenvolvedores PHP, ou Ruby on Rails para desenvolvedores Ruby. A Expo fornece uma camada sobre as APIs do React Native para torná-las mais fáceis de usar e gerenciar. Ele também fornece ferramentas que facilitam a inicialização e o teste de aplicativos React Native. Por fim, ele fornece componentes e serviços de interface do usuário que geralmente só estão disponíveis quando você instala um componente React Native de terceiros. Todos eles são disponibilizados através do Expo SDK.

Limitações da Expo

Antes de prosseguir, é importante estar ciente de algumas das limitações da Expo:

  1. Os aplicativos Expos são limitados às APIs nativas que o Expo SDK suporta. Isso significa que, se seu aplicativo tiver um caso de uso muito específico, como a comunicação com um periférico Bluetooth, a única opção para implementar essa funcionalidade é com React Native simples ou escrevendo código nativo.
  2. Expo te bloqueia em seu conjunto de ferramentas. Isso significa que você não pode simplesmente instalar e usar a maioria das ótimas ferramentas disponíveis para desenvolvimento React Native, como ferramentas de linha de comando, scaffolders e estruturas de interface do usuário. Mas o bom é que o Expo SDK é compatível com aplicativos React Native simples, então você não terá nenhum problema ao ejetar seu aplicativo do Expo.

Mesmo com essas limitações, é importante ter em mente que Expo é uma estrutura totalmente funcional com muito suporte para APIs Android ou iOS comumente usadas. Isso significa que ele oferece cobertura para a maioria das funcionalidades que os aplicativos geralmente precisam. Portanto, muitas vezes não há necessidade de procurar fora do Expo para implementar a funcionalidade nativa.

Visão geral do aplicativo

O aplicativo que vamos criar é um jogo de memória. Você pode estar familiarizado com esse tipo de jogo – o usuário precisa encontrar pares, virando duas cartas de cada vez. Veja como é a tela padrão:

E aqui está como fica uma vez que todos os pares foram abertos:

Depois de resolver o jogo, o usuário pode tocar no Redefinir botão para redefinir os itens para seu estado inicial. Isso permite que eles comecem o jogo novamente.

Instalando a Expo

Ao contrário do React Native simples, onde você precisa instalar e configurar o Android Studio ou o Xcode e outras dependências, com o Expo existem apenas alguns passos a seguir para começar a desenvolver aplicativos:

  1. Download e Instale Node.js e npm. A Expo depende da plataforma Node.js para suas ferramentas de linha de comando e gerenciamento de dependências. Node.js inclui um gerenciador de pacotes chamado npm. Certifique-se de que sua versão do npm seja 5.2 ou superior, você pode verificar com o npm -v comando. Caso contrário, atualize-o ou baixe a versão mais recente do Node.js. Isso é para poder executar executáveis ​​npm usando npx.
  2. Instale o Expo Client em seu iOS ou Android dispositivo. Isso é usado para visualizar o aplicativo enquanto você o desenvolve.
  3. Instale a ferramenta de linha de comando. Isso permite gerar um novo projeto Expo, iniciar um processo de construção e muito mais. Execute o seguinte comando para instalá-lo globalmente:

Ou se preferir fio:

Como nota lateral, a Expo também fornece uma ferramenta baseada em navegador chamada snack. O Snack é como um IDE baseado em navegador adaptado para o desenvolvimento de aplicativos React Native. Você pode escrever código e ver o resultado diretamente no seu navegador da Web, mesmo sem conectar um dispositivo móvel. Também é muito fácil de usar—sem necessidade de configuração.

Gerando um novo aplicativo Expo

Depois de instalar todas as dependências, agora você pode gerar um novo aplicativo Expo:

Feito isso, ele criará uma nova pasta chamada Jogo da memória. Navegue dentro dele e comece a executar o servidor de desenvolvimento:

Quando o servidor de desenvolvimento estiver em execução, você poderá ver algo assim:

Esse é o código QR que aponta para a visualização ao vivo do projeto. Abra o aplicativo cliente Expo em seu telefone e escaneie o código usando o scanner QR. Neste ponto, você deve conseguir visualizar a tela padrão. Toda vez que você bate Control-S em qualquer um dos arquivos de projeto, a visualização deve recarregar automaticamente para refletir as alterações.

Você pode encontrar o código-fonte completo do projeto em seu repositório GitHub. Ou se você quiser experimentar o aplicativo, confira a demonstração. Basta selecionar QR Code e digitalizá-lo em seu telefone usando o aplicativo cliente Expo.

Codificando o aplicativo

Agora estamos prontos para codificar o aplicativo. Vamos começar com alguns componentes de interface do usuário antes de voltarmos e implementarmos o componente principal.

Componente do cabeçalho

O cabeçalho é usado para exibir o título do aplicativo. Crie um componentes pasta. Dentro dele, crie um Header.js arquivo e adicione o seguinte:

Este é apenas um componente básico do React Native, com algum estilo para combinar com a interface do nosso aplicativo.

Componente de pontuação

Em seguida é o componente para exibir a pontuação (componentes/Score.js):

Novamente, apenas um componente de exibição simples com uma visualização de texto e alguns estilos básicos.

Componente do cartão

O componente do cartão (componentes/Card.js) exibirá os cartões. Esses cartões usam ícones do conjunto de ícones do vetor Expo. Este é um dos recursos que vêm direto da caixa quando você usa o Expo: inclui ícones de conjuntos de ícones como FontAwesome, Entypo e Ionicons.

No código abaixo, você pode ver que estamos usando apenas FontAwesome. Tem o ícone que queremos para mostrar o estado padrão do cartão: um ponto de interrogação. Como você verá mais tarde no componente principal do aplicativo, também usaremos ícones de Entypo e Ionicons. A referência a essas fontes de ícones será passada para este componente, portanto, não há necessidade de especificá-las aqui:

Dentro de render() método, só usamos a fonte e o ícone passados ​​como props se o cartão for aberto. Por padrão, ele exibirá apenas o ícone de ponto de interrogação do FontAwesome. Mas se o cartão estiver aberto, ele usará a fonte do ícone, o ícone e a cor que foram passados ​​como adereços.

Cada uma das cartas pode ser virada. Quando tocado, o clickCard() será executada, que também é passada através do props. Mais tarde você verá o que a função faz, mas por enquanto, saiba apenas que ela atualiza o estado para revelar o ícone no cartão:

Não se esqueça de adicionar os estilos:

Ajudantes

Também usaremos uma função auxiliar chamada shuffle(). Isso nos permite classificar o conjunto de cartas em ordem aleatória para que sua ordem seja diferente toda vez que o jogo for reiniciado:

Componente principal

O principal componente (App.js) contém a lógica principal do aplicativo e reúne tudo. Comece incluindo os pacotes React e Expo que usaremos. Desta vez, estamos usando todas as fontes de ícones dos ícones vetoriais da Expo:

Em seguida, inclua os componentes e o auxiliar que criamos anteriormente:

Dentro do construtor, primeiro criamos o array que representa os cartões exclusivos. src é a fonte do ícone, name é o nome do ícone (você pode encontrar os nomes no GitHub se quiser usar outros ícones), e color é, naturalmente, a cor do ícone:

Observe que, em vez de especificar diretamente o src Como FontAwesome, Entypo ou Ionicons para cada um dos objetos, estamos usando os nomes de propriedade usados ​​no sources objeto. Isso porque precisaremos criar uma cópia do array de cartas para que cada carta tenha um par. Criando uma cópia usando métodos de matriz, como slice() irá criar uma cópia do array, mas o problema é que uma vez que os objetos individuais são modificados na cópia ou no original, ambos os arrays também são modificados.

Isso nos leva à solução abaixo, que é criar um objeto completamente novo convertendo o cards array em uma string e, em seguida, analisando-o para convertê-lo de volta em um array. Esta é a razão pela qual estamos usando strings, já que as funções não podem ser convertidas em strings. Em seguida, combinamos os dois para criar o array, que contém todos os cartões de que precisamos:

Em seguida, percorra esse array e gere um ID exclusivo para cada um, defina a origem do ícone e, em seguida, defina-o como um estado fechado por padrão:

Classifique os cartões aleatoriamente e defina o estado padrão:

o render() O método renderiza o cabeçalho, os cartões, a pontuação e o botão para redefinir o jogo atual. Está usando o renderRows() função para renderizar as linhas de cartão individuais. A tela terá seis linhas contendo quatro cartas cada:

Aqui está o código para o renderRows() função. Este usa o getRowContents() função, que é responsável por criar um array de arrays com quatro itens cada. Isso nos permite renderizar cada linha e, em seguida, usar outra função para renderizar cartões para cada iteração do map() função:

Aqui está o getRowContents() função:

A seguir é o renderCards() função. Isso aceita a matriz de objetos de cartão e os renderiza por meio do Card componente. Tudo o que precisamos fazer aqui é passar as propriedades individuais de cada objeto de cartão como adereços. Isso é usado para renderizar o ícone correto, como você viu no código para o Card componente. o clickCard() função também é passada como uma prop. O ID do cartão é passado para essa função para que o cartão exclusivo possa ser identificado e atualizado:

Dentro de clickCard() função, obtemos os detalhes do cartão selecionado e verificamos se ele deve ser processado:

Agora vamos preencher o código para lidar com um cartão selecionado.

Primeiro, abrimos o cartão e o adicionamos ao array de cartões atualmente selecionados:

Uma vez que existem dois itens na matriz de cartões selecionados no momento, verificamos se os nomes dos ícones são os mesmos. Se estiverem, significa que o usuário selecionou o par correto. Se eles não forem iguais, então é um par incorreto. Nesse caso, fechamos o primeiro cartão selecionado e adicionamos um pouco de atraso antes de fechar o segundo cartão. (Dessa forma, o usuário pode ver o ícone do cartão antes que ele volte ao estado fechado.)

A última coisa que precisamos fazer no manipulador de eventos de clique é atualizar o estado para refletir as alterações na interface do usuário:

Uma função relacionada é o manipulador de eventos reset. Quando o Redefinir botão é tocado, nós simplesmente restauramos o estado padrão fechando todas as cartas e embaralhando.

Por fim, adicionaremos alguns estilos básicos para deixar nosso aplicativo com boa aparência.

Teste o aplicativo

Como o servidor de desenvolvimento da Expo está em execução o tempo todo, todas as alterações devem ser enviadas ao seu dispositivo móvel com recarga ao vivo. Experimente o aplicativo e verifique se ele funciona como deveria.

Conclusão

É isso! Neste tutorial, você aprendeu como usar o Expo XDE para conectar rapidamente um aplicativo React Native. Expo é uma ótima maneira de começar a desenvolver aplicativos React Native, pois elimina a necessidade de instalar muitos softwares, o que geralmente é motivo de frustração, especialmente para iniciantes. Ele também fornece ferramentas que facilitam a visualização do aplicativo enquanto ele está sendo desenvolvido. Certifique-se de verificar os recursos mencionados no site da Expo se quiser saber mais.

Este post foi atualizado com contribuições de Kingsley Ubah. Kingsley é apaixonado por criar conteúdo que educa e inspira os leitores. Os hobbies incluem leitura, futebol e ciclismo.

Deixe uma resposta