- Iniciar um projeto React Native para mobile app.
- Utilização de ambiente Android.
- Incluir ESLint, Prettier & EditorConfig.
- debug via Reactotron.
- Navegação entre páginas: React Navigation.
- Estilização via Styled Components.
- Acessando dados de API do Github.
- Acessando localstorage do Google Chrome.
Um aplicativo mobile para a busca de usuário de Github e ver o perfil e uma lista de seus repositórios marcados com Star.
Esse projeto foi desenvolvido para o ambiente mobile. No desenvolvimento do projeto foi usado o emulador mobile: Genymotion. Instruções para a instalação do Genymotion: https://docs.rocketseat.dev/ambiente-react-native/android/emulador Iiniciar o GenyMotion:
./genymotion (na pasta genymotion)
Dentro da pasta do projeto, Para iniciar o bundle:
yarn react-native start
ou
yarn react-native start --reset-cache
Redirecionamento de porta para o uso do debugger: Reactotron.
adb reverse tcp:9090 tcp:9090 ( redirecionar à porta do Reactotron)
Iniciar o app:
yarn react-native run-android
obs. O aplicativo foi desenvolvido para o ambiente Android.
-
Ambiente de desenvolvimento:
- Instalar NodeJS, JDK e dependencias.
- Instalar SDK do Android.
- Instalar Genymotion (emulador de mobile Android).
- Guideline:
-
Iniciando o projeto:
-
yarn react-native init modulo06
- App.js
- Remover comentarios, const, text que não seja "Welocme to React".
- obs. Todos os elementos ja tem display: flex do css.
-
-
ESLint, Prettier & EditorConfig
-
Criar .editorconfig
-
Add ESLint:
yarn add eslint -D yarn eslint --init yarn add prettier eslint-config-prettier eslint-plugin-prettier babel-eslint -D
-
Criar .eslintrc.js
-
Criar .prettierrc
-
Reiniciar o bundle.
-
-
Configurando o Reactotron
- Debugger pode causar problemas, portanto vamos usar o reactotron:
- Google: Reactotron
2. Link: https://github.com/infinitered/reactotron/releases
3. Download and Install: reactotron-app_2.17.1_amd64.deb
yarn add reactotron-react-native
- Google: Reactotron
2. Link: https://github.com/infinitered/reactotron/releases
3. Download and Install: reactotron-app_2.17.1_amd64.deb
- Criar src, src/index.js, src/config/ReactotronConfig.js
- Transfere todo o codigo do App.js para src/index.js e deleta App.js
- modulo06/index.js: import App from './src';
- Adicionar ao .eslintrc.js em globals:
__DEV__: 'readonly'
- src/index.js: import './config/ReactotronConfig';
- Se não conectar o Reactotron:
- Se você tem o adb instalado na sua distro Linux provavelmente ele está diferente da versão do Genymotion.
- Seguir o guideline:
- Redirecionamento de porta: Terminal:
adb reverse tcp:9090 tcp:9090 yarn react-native start --reset-cache
- teste: src/index.js
console.tron.log('Hello World');
- Debugger pode causar problemas, portanto vamos usar o reactotron:
-
React Navigation
- src/index.js: Deletar tudo e deixar:
import React from 'react'; import { View } from 'react-native'; import './config/Reactotron'; export default function App() { return <View />; }
- Criar a pasta src/pages e:
- pages/Main/index.js
- pages/User/index.js
-
yarn add react-navigation yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view
obs. Ver a última vesão de instalação de dependencias React Native project. https://reactnavigation.org/docs/en/getting-started.html. obs. Foi necessário instalar a nova versão de: yarn add @react-navigation/native https://reactnavigation.org/docs/pt-BR/getting-started.html.
- Criar src/routes.js
-
Vamos usar navigation by stack: https://reactnavigation.org/docs/en/hello-react-navigation.html
yarn add react-navigation/stack
-
Segue as instruções no link.
-
Adicionar Main e User em routes via StackNavigator. Os componentes devem ficar algo assim:
<Stack.Screen name="Main" component={Main} options={{ title: 'Usuários', headerBackTitleVisible: false, headerTitleAlign: 'center', headerTintColor: '#FFF', headerStyle: { backgroundColor: '#7159c1', }, }} />
-
index.js: import routes depois do import reactotron para entrar no debug reactotron (console.tron).
-
- src/index.js: Deletar tudo e deixar:
-
Configurando o StatusBar
import { StatusBar } from 'react-native';
-
Styled Components
yarn add styled-components
- Criar Main/styles.js
-
Estilizando formulário
- Main/index.js
- Acesso a MaterialIcons:
yarn add react-native-vector-icons
- https://github.com/oblador/react-native-vector-icons
- abrir pasta android/app/build.gradle
project.ext.vectoricons = [ iconFontNames: [ 'MaterialIcons.ttf' ] // Name of the font files you want to copy ] apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
- abrir pasta android/app/build.gradle
- Main/index.js: import Icon from 'react-native-vector-icons/MaterialIcons'
- Google -> react native vector icons -> github -> site na 1a linha:
- https://oblador.github.io/react-native-vector-icons/
-
Acessando API do Github
- Main/index.js
- Quando o usuario preencher os dados no placeholder e clicar no '+', vamos buscar os dados no github do usuario e adicionar num 'state'.
- Para isso, alteramos a function Main para class.
- obs. no Input: add value e onChangeText. Add returnKeyType e onSubmitEditing.
- função handleAddUser. this.handleAddUser vai no SubmitButton e não no Form (React Native não tem Form).
- API (adicionar axios):
yarn add axios
- Criar src/services/api.js
- import ao handleAddUser.
- import { Keyboard } from 'react-native';
- Keyboard.dismiss();
- Main/index.js
-
Estilizando a listagem
- List:
- React Native não tem ul, li e não tem .map. React Native ja tem List padrão com barra de rolagem, etc.
- usar FlatList
- Main.index/js e Main/styles.js
- List:
-
Loading e disabled
- Main/index.js:
import { Keyboard, ActivityIndicator } from 'react-native';
- Incluir loading no state.
- Main/styles.js: Add opacity.
- Main/index.js:
-
Salvando no storage
- React Native não tem API para localstorage.
yarn add @react-native-community/async-storage yarn react-native run-android
- Main/index.js: import AsyncStorage from '@react-native-community/async-storage';
- Criar as funções async componentDidMount() e componentDidUpdate().
-
Realizando Navegação
- Todos as paginas dentro do createStackNavigator vem com a propriedade Navigation (e dentro tem o metodo navigate). Vide: console.tron.log(this.props)
- Main/index.js
- criar handleNavigate
- Add prop-types para validar alguns erros de propriedades. Incluir static proptypes no Mai/index.js
yarn add prop-types
-
Buscando dados da API
- User/index.js
- Incluir component e transformar em class
- componentDidMount;
- Incluir console.tron.log(this.props)
- api.get(
/users/${user.login}/starred
). - PropTypes para acabar com erros ESLint.
- User/index.js
-
Listando Favoritos
- User/index.js
- Criar COntainer, HEader, Avatar, Name, Bio. e estilizar.
- Criar Starts, OwnerAvatar, Info, Title, Author e estilizar.
- User/index.js