React Native
React Native
Dispositivos móveis.
Android.
iOS.
Entre suas características está que o mesmo tem uma integração muito
superior ao hardware em que opera, já que o mesmo foi desenvolvido
para aquele hardware diferentemente de seus concorrentes que
objetivam funcionar em aparelhos produzidos por diversas empresas.
Esta característica em especial é de grande valia tendo em vista que o
desempenho do aparelho em relação ao hardware é visivelmente
superior.
Nativo:
Vantagens:
● Velocidade de execução.
● Performance melhorada.
● Melhor acesso ao hardware do aparelho (câmera, GPS,
etc...)
Desvantagens:
Webapp:
● Velocidade no desenvolvimento.
● Portabilidade para múltiplos dispositivos.
● Atualização dinâmica.
Desvantagens:
● Baixa performance.
● Praticamente nenhum acesso direto aos recursos de
hardware (dependendo do navegador para tal).
● Não é permitida a postagem em nenhuma loja de vendas de
aplicativos dos sistemas operacionais.
Híbrido:
Vantagens:
Desvantagens:
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
5 – Em sua opinião existe alguma abordagem que não deva ser utilizada
sob nenhuma circunstancia no mercado atual? Justifique.
Atividade Prática: 01
Desenvolvimento Nativo
Agora, vamos criar um novo projeto Expo. Abra o terminal, navegue até
a pasta que deseja que o projeto esteja e digite o comando abaixo:
A parte sublinhada deve ser trocada pelo nome do projeto que deseja
cd meuprojeto
Entendendo o App.js
Conclusão
CustomButtom.js
import React from 'react';
import { TouchableOpacity, Text} from 'react-native';
import Styles from './Style'
Por fim, temos o ‘export default CustomButton;’ que serve para exportar
este componente. Com esta exportação, o componente se torna
acessível e implementável em outras páginas quando necessário.
Style.js
button: {
backgroundColor: '#1e90ff',
paddingVertical: 12,
paddingHorizontal: 25,
borderRadius: 5,
alignItems: 'center',
},
buttonText: {
color: '#fff',
fontSize: 16,
fontWeight: 'bold',
},
});
Implementação
Caixa de texto
A Caixa de texto é mais simples, vamos criar na pasta de componentes,
uma nova pasta: a “TextInputBox” e dentro dela criaremos os arquivos
“TextInputBox.js” e “Style.js”. Como mostra a imagem:
input: {
height: 40,
borderColor: '#ccc',
borderWidth: 1,
borderRadius: 5,
paddingHorizontal: 10,
marginVertical: 10,
width: '80%',
},
});
Nada fora do que foi feito no botão, apenas uma folha de estilo simples.
Para tal, vamos iniciar criando um novo arquivo que irá contar a lógica
deste processo. Vamos criar uma pasta chamada ‘acao’ e um arquivo
chamado ‘FuncaoSoma.js’
Este trecho contém a lógica para somar dois números, não tem grandes
detalhes neste código, visto que é apenas javascript puro e simples,
porém vamos ressaltar alguns detalhes, como o IF que faz uma
verificação de erro na variável, impedindo que haja algum erro de
execução durante o cálculo, e, é claro, o import do ‘Alert’ necessário
para a chamada da caixa na tela.
return (
<View style={styles.container}>
<StatusBar style="auto" />
</View>
);
}
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
3 – Por que devemos utilizar o CSS como ferramenta dentro das nossas
aplicações.
4.2.6 Outros:
● SafeAreaView: Renderiza o conteúdo dentro da área segura do
dispositivo, evitando sobreposições com barras de status ou
entalhes.
● Dimensions: Fornece informações sobre as dimensões da tela do
dispositivo.
● Platform: Permite executar código específico para plataformas
diferentes (iOS/Android).
● Linking: Abre URLs externas em navegadores ou outros
aplicativos.
● Animated: API para criação de animações.
● Gesture Responder System: Sistema para lidar com gestos do
usuário (toques, deslizar, etc.).
● AccessibilityInfo: fornece informações sobre o estado atual dos
recursos de acessibilidade.
● Appearance: fornece a interface para consultar as preferências de
aparência do usuário, por exemplo, o esquema de cores preferido
(claro ou escuro).
● BackHandler: permite que você detecte quando o usuário
pressiona o botão "Voltar" do hardware em seu dispositivo Android
e, opcionalmente, executar algum código.
● Clipboard: fornece acesso à área de transferência do sistema,
tanto para ler quanto para gravar.
● InteractionManager: ajuda a agendar a execução de animações e
outras tarefas.
UFA!
4.2.7 Explorando.
return (
<View style={styles.container}>
<StatusBar style="auto" />
</View>
);
}
4.2.7.1 StatusBar
Faz com que exista ou não exista a animação de ‘fade’ ao utilizar a barra
status. Padrão true.
4.2.7.2 View
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
}
Neste CSS, vemos ali, por exemplo, o elemento ‘flex’ que configura o
view para ocupar a totalidade da tela. Vemos mudança da cor de fundo,
e do alinhamento de tudo que estiver lá dentro. Também podemos
colocar coisas como ‘padding’ e até mesmo ‘color’, que mudaria a cor do
texto de tudo que está escrito na tela que não possui cor definida.
4.2.7.3 Image
<Image
style={styles.logo}
source={require('./images/logo.jpg')}
/>
</View>
);
}
4.2.7.3.2 Refatorando.
O que acontece, o logo de um projeto por exemplo, geralmente é
utilizado com frequência em vários momentos do projeto, então não é
legal deixar ele solto assim na página principal, vamos criar um
componente customizado do ‘image’ para ele, como fizemos para o
botão e a caixa de texto.
function Logo() {
return (
<Image
style={Styles.logo}
source={require('../../images/logo.jpg')}
/>
);
}
export default Logo;
4.2.7.4 Scrollview.
return (
<View style={styles.container}>
<StatusBar style="auto" />
<ScrollView contentContainerStyle={styles.container} >
<Logo />
<Text style={styles.title}>Soma de Dois Números</Text>
<TextInputBox
value={number1}
onChangeText={setNumber1}
placeholder="Digite o primeiro número"
keyboardType="numeric"
/>
<TextInputBox
value={number2}
onChangeText={setNumber2}
placeholder="Digite o segundo número"
keyboardType="numeric"
/>
<CustomButton
title="Somar"
onPress={() => FuncaoSoma(number1,number2)}
style={styles.button}
/>
</ScrollView>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
title: {
fontSize: 24,
marginBottom: 20,
},
scroll:{
backgroundColor: '#fff',
}
});
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
Atividade Prática
5.1 Introdução.
Agora vamos para navegação, entre janelas, existem algumas maneiras
de fazer esse tipo de navegação, neste capítulo vamos falar da
‘TabNavgator’.
Esta técnica envolve a criação de um menu inferior, basicamente um
menu na parte de baixo da tela do dispositivo é criado, permitindo a
navegação entre páginas.
Na raiz do projeto, foi criado a pasta ‘screens’ e dentro dela uma pasta
para cada página que queremos montar e dentro destas pastas os
arquivos JS com o nome da página em questão, que no nosso caso é
CalculoScreen.js e HomeScreen.js.
OBS: Não foi criado um CSS separado em cada página, visto que não
fazia sentido para nosso projeto neste momento, deixando o css de cada
um dentro da própria página, porém fica claro que seria o ideal separar o
CSS do arquivo base.
Para nossos arquivos auxiliares, vamos colocar arquivos que ja foram
explorados anteriormente, como o ‘CustomButton’ e o ‘TextInputBox’,
‘Logo’. Já o calculo colocaremos separado em uma nova função, criada
em uma pasta chamada ‘utils’ sob o nome de ‘MathUtils.js’, como na
imagem abaixo:
class MathUtils{
static funcaoCalculo(number1, number2, acao) {
var sum;
switch (acao) {
case '+':
sum = parseFloat(number1) + parseFloat(number2);
break;
case '-':
sum = parseFloat(number1) - parseFloat(number2);
break;
case '*':
sum = parseFloat(number1) * parseFloat(number2);
break;
case '/':
sum = parseFloat(number1) / parseFloat(number2);
break;
default:
break;
}
if (isNaN(sum)) {
Alert.alert('Erro', 'Por favor, insira números válidos.');
} else {
Alert.alert('Resultado', `A soma é: ${sum}`);
}
}
}
export default MathUtils;
function HomeScreen() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Image
style={styles.logo}
source={require('../../images/logo.jpg')}
/>
<Text>Home Screen</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
title: {
fontSize: 24,
marginBottom: 20,
},
picker: {
height: 50,
width: 200,
},
logo:{
width: 100,
height: 100,
marginBottom: 20
}
});
export default HomeScreen;
function CalculoScreen() {
const [number1, setNumber1] = useState('');
const [number2, setNumber2] = useState('');
const [selectedValue, setSelectedValue] = useState('Somar');
return (
<View style={styles.container}>
<StatusBar style="auto" />
<TextInputBox
value={number2}
onChangeText={setNumber2}
placeholder="Digite o segundo número"
keyboardType="numeric"
/>
<CustomButton
title="Calcular"
onPress={() =>
MathUtils.funcaoCalculo(number1,number2,selectedValue)}
style={styles.button}
/>
</View>
);
}
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
4 - Baseando-se no uso, por que não devemos criar muitas páginas nas
Tabs?
Capítulo 6: Drawer e etc…
6.1 Introdução.
Agora vamos seguir nossa estrutura de telas para o Drawer.
O Drawer nada mais é do que o famoso menu sandwich, aquele que fica
na lateral dos aplicativos e, ao clicar,um menu suspenso aparece.
Para nosso exemplo, partiremos do exemplo da aula anterior, facilitará
bastante nosso processo.
Bom, vamos a implantação:
6.2 Baixando as bibliotecas
Para começar, vamos começar adicionando a biblioteca necessária no
ReactNative para criar tal objeto.
return (
<View style={styles.container}>
<StatusBar style="auto" />
<Text style={styles.title}>IMC</Text>
<TextInputBox
value={altura}
onChangeText={setAltura}
placeholder="Digite sua Altura em cm"
keyboardType="numeric"
/>
<TextInputBox
value={peso}
onChangeText={setPeso}
placeholder="Digite o peso em kg"
keyboardType="numeric"
/>
<CustomButton
title="Calcular"
onPress={() => MathUtils.calculaIMC(peso,altura,setImc,setMensagem)}
style={styles.button}
/>
</View>
);
}
MathUtils.js
class MathUtils{
static funcaoCalculo(number1, number2, acao) {
var sum;
switch (acao) {
case '+':
sum = parseFloat(number1) + parseFloat(number2);
break;
case '-':
sum = parseFloat(number1) - parseFloat(number2);
break;
case '*':
sum = parseFloat(number1) * parseFloat(number2);
break;
case '/':
sum = parseFloat(number1) / parseFloat(number2);
break;
default:
break;
}
if (isNaN(sum)) {
Alert.alert('Erro', 'Por favor, insira números válidos.');
} else {
Alert.alert('Resultado', `A soma é: ${sum}`);
}
}
if (!altura || !peso) {
setImc('Erro: Insira valores válidos');
return;
}
altura = altura /100;
const imc = peso / (altura*altura);
setImc(imc.toFixed(2));
setMensagem(this.statusIMC(imc));
}
static statusIMC(imc){
if(imc < 18.5){
return "Abaixo do peso";
}else if(imc < 24){
return "Normal"
}else if(imc < 30){
return "SobrePeso grau 1";
}else if(imc < 40){
return "Obesidade grau 2"
}else{
return "Obsidade Grave grau 3";
}
}
}
export default MathUtils;
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
7.1 Introdução.
Até o momento, vínhamos executando o processo utilizando o expoGo e
as simulações feitas através do navegador, porém vamos executar
agora um fluxo que nos permitirá ter compilar em nossos celulares o
fluxo e deixar o app rodando nativamente la.
Faremos isso porque, devido a limitações do navegador, certas tarefas
como banco de dados não são emulados nele, e em muitos casos não
conseguimos utilizar o ExpoGo devido a necessidade de estarmos na
mesma rede, uma limitação complicada em alguns casos de laboratórios
e tals. Para isso, vamos emular diretamente no celular via cabo.
7.2 Instalação
Precisamos da instalação do Andoid Studio,
devido a certas bibliotecas, como as DLLs do
android e também as ferramentas que
permitem a conexão entre o android e o
computador, devemos ter esta ferramenta
instalada na maquina. Vamos começar com ela
então.
link: https://developer.android.com/?hl=pt-br
adb devices -l
Atenção!!
Agora vamos enviar o código:
IMPORTANTE.
Ao fim do comando sendo executado, o celular irá pedir permissão
novamente para instalar o app, e existe um tempo limite para responder,
fique atento.
Capítulo 7: Rodando no celular
diretamente via Cabo.
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
8.1 Introdução.
Agora vamos ao famigerado banco de dados. Neste ponto, o que
queremos é que, em nossa situação, os dados sejam gravados e
possamos utilizá-los quando necessário.
Bancos de dados são uma das grandes bases dos projetos e sem eles
nossa vida seria muito diferente.
8.3 SGBD
8.4 SQL
SQL (Structured Query Language) ou linguagem de consulta estruturada
é uma linguagem utilizada para comunicação entre software e bancos de
dados relacionais declarada padrão no mercado.
Esta linguagem é um
grande padrão no
mercado, devido a ser
extremamente simples e
de fácil entendimento.
Sendo assim, ela possui
grandes adeptos e com o
tempo todas as grandes
plataformas de Bancos de dados adotaram seus preceitos de
funcionamento.
OBS: O nome do SQL originalmente era SEQUEL e por isso até hoje a
sigla em inglês é pronunciada SÍ-QUE-EL.
Para as aplicações mobile, quando se precisa de um banco de dados
relacional local, rodando diretamente no aparelho, utiliza-se o SQLite.
4.5 SQLite
Ao contrário de sistemas
robustos como MySQL
ou PostgreSQL, que
exigem um servidor
dedicado, o SQLite se
diferencia por ser um
banco de dados
embarcado. Isso
significa que sua
biblioteca é integrada
diretamente ao aplicativo, eliminando a necessidade de um processo
servidor separado. Imagine o SQLite como um "mini banco de dados"
que reside dentro do próprio programa, proporcionando uma gestão de
dados eficiente e independente.
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
9.1 Introdução.
Neste momento, vamos começar a implementar o SQLite no nosso
projeto em desenvolvimento.
Para facilitar nosso dia a dia, vamos utilizar a estrutura que já possuímos
de outros exemplos para fluir nosso código.
OBS: Os experimentos foram feitos e testados para rodar diretamente
no celular, o banco de dados geralmente não funciona bem emulado em
ambiente web.
const db = SQLite.openDatabase('agenda.db');
createTable();
db.transaction(tx => {
tx.executeSql(
'codigoSQL',
[], //parametros
() => {}, // o que fazer se der certo
(tx, error) => {} //o que fazer se der errado.
);
});
};
9.3.1 createTable
Vejamos no nosso exemplo, no ‘createTable’, é executado um SQL que
cria uma nova tabela caso a mesma não exista: “CREATE TABLE IF
NOT EXISTS agenda (id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT, telefone TEXT);”
Este comando é executado e o mesmo apresenta um sucesso ou um
fracasso, em qualquer um dos casos, é utilizado um console.log para
denotar que obtivemos sucesso ou fracasso nele.
9.3.2 getAgenda
No método de consulta, o ‘getAgenda’ é feito uma consulta simples,
porém o método em questão recebe um ‘setAgenda’ como parâmetro,
que na prática é uma variável para absorver o resultado desta consulta.
Neste caso, podemos ver que, caso obtenhamos sucesso na consulta,
além da mensagem, os resultados da consulta são inseridos na variável
‘getAgenda’ para assim serem utilizados pelo front.
9.3.4 Front.
Bom esta foi a parte mais difícil, agora vamos criar um front para
interagir com nosso banco, para isso vamos na pasta ‘screens’ e
criaremos a pasta ‘agenda’ e o arquivo ‘agendaScreen.js’
Dentro deste arquivo, iremos colocar o conteúdo necessário para exibir
e inserir novos registros em uma página. Vamos dar uma olhada no
código e discutir o mesmo a seguir:
useEffect(() => {
getAgenda(setAgenda);
}, []);
return (
<View style={styles.container}>
<Text style={styles.titulo}>Agenda</Text>
<View style={styles.inputContainer}>
<TextInput
style={styles.input}
placeholder="Digite Nome"
value={novoNome}
onChangeText={setNovoNome}
/>
<TextInput
style={styles.input}
placeholder="Telefone"
value={novoTelefone}
onChangeText={setNovoTelefone}
/>
<Button title="Adicionar" onPress={() => {
adicionarAgenda(novoNome, novoNovoTelefone, setAgenda);
setNovoNome('');
setNovoTelefone('');
}}
/>
</View>
<Text style={styles.titulo}>LISTA:</Text>
<FlatList
data={agenda}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.item}>
<Text>{item.nome}</Text>
<Text> --- </Text>
<Text>{item.telefone}</Text>
</View>
)}
/>
</View>
);
}
Não vamos nos ater aos detalhes deste código que já foram explicados
em outros capítulos, o que precisamos ver aqui são as relações com o
banco de dados.
9.3.5 Menu
Agora vamos finalizar, adicionando o novo item ao menu, para isso
vamos ao ‘App.js’ principal e adicionaremos mais um item, vejamos
como o código ficou:
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
10.1 Introdução.
Agora vamos acrescentar um novo fluxo, a remoção. Neste caso, vamos
criar a função de deletar um registro de nossa tabela agenda.
Para isso, vamos ter que alterar alguns arquivos existentes, porém muito
rapidamente podemos fazer tais alterações.
10.2.1 Repository.
Bom, vamos começar com o ‘agendaRepository.js’, que contém as
relações com nosso banco de dados, para tal, vamos adicionar a
seguinte função:
10.2.2 Front.
Agora vamos alterar o front, esta parte é muito fácil, visto que vamos
apenas acrescentar um botão ao ‘FlatList’ que já existe. Vejamos o
código:
</View>
<Text style={styles.titulo}>LISTA:</Text>
<FlatList
data={agenda}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.item}>
<Text>{item.nome}</Text>
<Text> --- </Text>
<Text>{item.telefone}</Text>
<Button title="Remover" onPress={() => removerAgenda(item.id,
setAgenda)} />
</View>
)}
/>
</View>
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Atividade Prática
11.1 Introdução.
Vamos começar a parte final, onde falaremos do de API’s.
Uma API, ou Interface de Programação de Aplicações, é um conjunto de
definições e protocolos que permite que diferentes sistemas de software
interajam entre si. Imagine uma API como um garçom em um
restaurante. Você, o cliente (ou aplicação), pede comida (dados ou
funcionalidades) ao garçom (API). O garçom, por sua vez, comunica o
seu pedido à cozinha (outro sistema de software) e traz de volta a sua
comida (resposta).
11.2 JSON
JSON, abreviação de JavaScript Object Notation, é um formato de
dados leve e legível por humanos, amplamente utilizado para
representar estruturas de dados e para troca de informações,
especialmente em aplicações web. Pense em um arquivo JSON como
uma receita de bolo: ele lista os ingredientes (dados) e suas quantidades
(valores) de forma organizada e fácil de entender, tanto para você
quanto para o computador.
A beleza do JSON está na sua simplicidade. Ele utiliza pares de
chave-valor para representar dados, onde a "chave" é como um rótulo
que descreve o dado e o "valor" é o próprio dado. Por exemplo: "nome":
"Maria" indica que o valor associado à chave "nome" é "Maria". Essas
informações são organizadas em objetos, que podem conter múltiplos
pares chave-valor, e arrays, que são listas ordenadas de dados.
function CepScreen() {
const [cep, setCep] = useState('');
const [endereco, setEndereco] = useState(null);
return (
<View style={styles.container}>
<StatusBar style="auto" />
<Text style={styles.title}>CEP</Text>
<TextInputBox
value={cep}
onChangeText={setCep}
placeholder="Digite o CEP"
keyboardType="numeric"
/>
<CustomButton
title="Calcular"
onPress={() => Apis.buscaEndereco(cep, setEndereco)}
style={styles.button}
/>
</View>
);
}
NOME:__________________________________ N°_____
TURMA:_______
PROFESSOR:_______________
DATA: __/__ /____ NOTA:
Exercícios
1 – Para sua aplicação, vamos criar uma nova chamada a uma api,
(https://api.thecatapi.com/v1/images/search) esta api retorna um JSON
que contem uma URL de uma imagem de um gato aleatório, tente
recuperar essa url e colocar esta imagem dentro de nosso aplicativo.