Estamos no quarto artigo da nossa série de artigos sobre React Native. Neste artigo vamos finalizar a nossa UI (Interface do Usuário), criando o card é listagem para exibirmos os produtos que estão em oferta. Relembrando estamos desenvolvendo um aplicativo que lista ofertas, promoções e desconto em produtos, pegando essas informações de uma API. Veja o terceiro artigo da série onde criamos a primeira parte da UI. Criando o primeiro componente com React Native.
Vamos criar dois componentes: PromotionCard e PromotionsList.
- PromotionCard: É o card onde será apresentado o produto que está em promoção, seu preço e o link para visualizar o mesmo.
- PromotionsList: Será um scroll que conterá os cards com os produtos.
Abra seu editor de códigos, crie o diretório PromotionCard dentro do diretório components. Depois crie os arquivos index.js e styles.js.

No componente PromotionCard, vamos utilizar os componentes do React Native:
- View
- Image
- Text
- TouchableHighlight
- Linking oferece uma interface geral para interagir com links de aplicativos de entrada e saída. Estamos utilizando este componente, para quando o usuário clicar no botão: Ir para loja, o link da loja ser aberto no navegador do smartphone.
Eu já falei mais sobre esses componentes no artigo anterior, assim para não ser repetitivo somente falei sobre o componente Linking.
Por fim nosso componente PromotionCard ficará do seguinte modo:
import React, { Component } from 'react'
import { View, Text, TouchableHighlight, Image, Linking } from 'react-native'
import Styles from './styles'
class PromotionCard extends Component {
constructor(props) {
super(props)
}
render() {
return(
<View style={ Styles.centeredView }>
<View style={ Styles.cardView }>
<Image style={ Styles.promotionImage } source={ {uri: this.props.data.imageUri} } />
<View style={ Styles.descriptionText }>
<Text style={ Styles.titleText }>{ this.props.data.title }</Text>
<Text style={ Styles.priceText }>{ this.props.data.price }</Text>
<TouchableHighlight
style={ Styles.linkButton }
onPress={ async () => {
const supported = await Linking.canOpenURL(this.props.data.linkUrl);
if (supported) {
await Linking.openURL(this.props.data.linkUrl);
}
}}
>
<Text style={ Styles.textLinkButton }>Ir para loja</Text>
</TouchableHighlight>
</View>
</View>
</View>
)
}
}
export default PromotionCard
Cole o conteúdo acima no arquivo components/PromotionCard/index.js. A estilização do componente fica em um arquivo separado no styles.js.
import { StyleSheet } from 'react-native'
export default StyleSheet.create({
centeredView: {
flex: 1,
alignItems: "center",
marginTop: 30
},
cardView: {
flexDirection: 'row',
justifyContent: 'space-between',
margin: 5,
backgroundColor: "white",
borderRadius: 15,
padding: 15,
shadowColor: "#000",
shadowOffset: {
width: 0,
height: 2
},
shadowOpacity: 0.25,
shadowRadius: 3.84,
elevation: 5,
width: '94%',
minHeight: 200
},
promotionImage: {
width: '50%'
},
descriptionText: {
flex: 1
},
titleText: {
color: "black",
fontWeight: "bold",
fontSize: 16,
margin: 5
},
priceText: {
color: "#e73931",
fontWeight: "bold",
fontSize: 16,
margin: 5
},
linkButton: {
backgroundColor: "#2196F3",
borderRadius: 15,
padding: 10,
elevation: 2,
margin: 5
},
textLinkButton: {
color: "#FFFFFF",
textAlign: 'center'
}
})
Cole o conteúdo acima no arquivo components/PromotionCard/styles.js.
Agora vamos criar nosso componente PromotionsList. Crie o diretório PromotionsList dentro do diretório components. Depois crie os arquivos index.js e styles.js.

No componente PromotionsList vamos utilizar o componente do React Native FlatList. Também vamos utilizar nosso componente recém criado PromotionCard.
- FlatList e uma interface de alto desempenho para renderizar listas simples e básicas, com suporte para os recursos mais úteis.
- PromotionCard componente que criamos anteriormente ele organiza os elementos da produção em um card para uma boa visualização pelo usuário.
Nosso componente PromotionsList ficará do seguinte modo:
import React, { Component } from 'react'
import { FlatList } from 'react-native'
import Styles from './styles'
import PromotionCard from './../PromotionCard'
class PromotionsList extends Component {
constructor(props) {
super(props)
this.state = {
data: [
{
id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
title: 'Bota Impermeável Bull Terrier Alpina Dry – Masculina',
price: 'De: R$399,99 - Por: R$299,99',
imageUri: 'https://irias.com.br/blog/wp-content/uploads/2020/11/bota-impermeavel-bull-terrier-alpina-dry-masculina-img-150x150-1.jpg',
linkUrl: 'https://www.centauro.com.br/bota-bull-terrier-alpina-dry-masculina-855804.html'
}
]
}
}
render() {
return(
<FlatList
style={ Styles.promotionsList }
data={ this.state.data }
renderItem={ ({ item }) => (
<PromotionCard data={ item } />
)}
keyExtractor={ item => item.id }
/>
)
}
}
export default PromotionsList
Cole o conteúdo acima no arquivo components/PromotionsList/index.js. A estilização do componente fica em um arquivo separado no styles.js.
import { StyleSheet } from 'react-native'
export default StyleSheet.create({
promotionsList: {
minHeight: '90%',
maxHeight: '90%',
backgroundColor: '#ffffff'
}
})
Cole o conteúdo acima no arquivo components/PromotionsList/styles.js.
Agora para concluir mais esta etapa, vamos atualizar nosso arquivo App.js para incluir nossos novos componentes criados.
import React from 'react'
import {
SafeAreaView,
StatusBar,
} from 'react-native'
import Header from './components/Header'
import PromotionsList from './components/PromotionsList'
const App: () => React$Node = () => {
return (
<>
<StatusBar />
<SafeAreaView>
<Header />
<PromotionsList />
</SafeAreaView>
</>
);
};
export default App;
Cole o conteúdo acima no arquivo App.js.
Ao finalizar nossa aplicação ficará com a seguinte aparência.

Assim concluímos esta parte do nosso projeto. No próximo artigo desta série, vamos continuar o desenvolvimento de mais uma parte do nosso aplicativo.
O projeto está disponível em meu GitHub: https://github.com/andersonirias/react-native-tutorial.

Boa noite, ótimo artigo.
Mas tenho uma duvida; como eu atualizo os meus produtos?.
Exemplo:
passou um mês e eu tenho que trocar os produtos em promoção.
Des de já agradeço.
Olá Izaias, primeiramente obrigado pelo seu comentário. No artigo: https://irias.com.br/blog/consumindo-dados-de-uma-api-rest-com-react-native/ que é o próximo dessa série, eu mostro como recuperar a lista de produtos de uma API REST.
Então para atualizar os produtos, você realiza a atualização na base de dados dessa API. Assim você atualiza os produtos no banco de dados da API e a API retorna os produtos que são dinamicamente atualizados no aplicativo.
Muito você me ajudou muito amigo